どう書く?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 件のコメント:
コメントを投稿