どう書く?orgより LL Golf Hole 2 - 文字列に含まれる単語の最初の文字を大文字にする
kozimaさんの書いたコードを改造してみた。たぶん処理系依存でなくなったと思う。
(defun cap (str)
(labels ((fn (x y)
(if (and (upper-case-p x)
(lower-case-p y))
x
y)))
(map 'string #'fn
str
(string-capitalize str))))
(cap "LL day and night") ; =>"LL Day And Night"
やっていることといえば、
①元の文字列と②string-capitalizeした文字列の各文字をそれぞれ比べて、①の大文字部分が②で小文字に変わっていたら①の文字を、そうでなければ②の文字を選択しているだけ。下のを縦読みするとなんとなく分かるかもしれない。
"LL day and night" ; ①str "Ll Day And Night" ; ②(string-capitalize str) ------------------ "LL Day And Night" ; 結果
そもそもstring-capitalizeの実装ってどうやるんだろう?
0 件のコメント:
コメントを投稿