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.