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