intersperse
があれば string-join
は簡単だ。デリミタを差し込んだ文字列のリストに string-append
を適用してやればいい。
gosh> (apply string-append (intersperse "-" '("foo" "bar" "baz"))) "foo-bar-baz"
と、思ったら string-join
には省略可能な引数 delim
と grammer
があった。
cf. 6.12 文字列 – Gauche ユーザリファレンス
delim
はデリミタで、省略すると空白文字1文字が使われる。
(define my-string-join (case-lambda ((slist) (my-string-join slist " ")) ((slist delim) (apply string-append (intersperse delim slist))))) (print (my-string-join '("foo" "bar" "baz"))) (print (my-string-join '("foo" "bar" "baz") "-"))
takatoh@apostrophe $ gosh my-string-join.scm foo bar baz foo-bar-baz
grammer
は手続きの挙動を決めるためのシンボルで、infix
、strict-infix
、prefix
、suffix
のいずれか。
今回、strict-infix
は面倒そうだったのでそれ以外を実装してみた。
(define my-string-join (case-lambda ((slist) (my-string-join slist " " 'infix)) ((slist delim) (my-string-join slist delim 'infix)) ((slist delim grammer) (let ((l (intersperse delim slist))) (cond ((eq? grammer 'infix) (apply string-append l)) ((eq? grammer 'prefix) (apply string-append (cons delim l))) ((eq? grammer 'suffix) (apply string-append (append l (list delim)))) (else (error "Illegal grammer."))))))) (print (my-string-join '("foo" "bar" "baz"))) (print (my-string-join '("foo" "bar" "baz") "-")) (print (my-string-join '("foo" "bar" "baz") "/" 'prefix)) (print (my-string-join '("foo" "bar" "baz") ";" 'suffix)) (print (my-string-join '("foo" "bar" "baz") ";" 'surfix)) ;; misspell
takatoh@apostrophe $ gosh my-string-join3.scm foo bar baz foo-bar-baz /foo/bar/baz foo;bar;baz; gosh: "error": Illegal grammer.