[racket] String manipulation without regex opinion
Racket's loop iteration system is extensible; we can extend Racket to
produce a 'for' loop that can accumulate strings. For example:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; An example of using for/fold/derived.
;;
;; for/string: a loop variant that produces a string:
(define-syntax (for/string stx)
(syntax-case stx ()
[(_ clauses . body)
(with-syntax ([original stx])
#'(list->string
(reverse
(for/fold/derived original
([chars/rev '()])
clauses
(cons (let () . body)
chars/rev)))))]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Hopefully we don't have to write this all out from scratch every time we
use it; we should probably sequester this into a library and not need to
look at it again. :)
But once we shuffle this in a library somewhere, we can use it like any of
the other loop variations, and it makes your subsequent definitions nice
and short:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; string -> string
;; Removes vowels from the input
(define (remove-vowels word)
(for/string ([ch (in-string word)]
#:when (not (member ch (list #\a #\e #\i #\o #\u))))
ch))
;; string -> string
;; Replaces spaces in the input with dashes
(define (replace-spaces word)
(for/string ([c (in-string word)])
(if (char=? c #\space) #\- c)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Best of wishes!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20121106/12859855/attachment-0001.html>