SRFI-13 に string-reverse という手続きがある。その名のとおり、文字列を逆順にする手続きだ。
gosh> (use srfi-13) #<undef> gosh> (string-reverse "abcdefg") "gfedcba"
で、何故か省略可能な引数が2つあって、逆順にするときの始端と終端を指定できる(逆順になった部分文字列が返ってくる)。
gosh> (string-reverse "abcdefg" 3) "gfed" gosh> (string-reverse "abcdefg" 3 5) "ed"
これを自分で作ってみた。こないだの case-lambda の練習。
(define string-reverse
(case-lambda
((s) (string-reverse s 0 (string-length s)))
((s start) (string-reverse s start (string-length s)))
((s start end)
(let loop ((c 0) (l (string->list s)) (r '()))
(cond ((= c end) (list->string r))
((< c start) (loop (+ c 1) (cdr l) r))
(else (loop (+ c 1) (cdr l) (cons (car l) r))))))))
(print (string-reverse "abcdefg"))
(print (string-reverse "abcdefg" 3))
(print (string-reverse "abcdefg" 3 5))
takatoh@apostrophe $ gosh string-reverse.scm gfedcba gfed ed