Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-02-23

KMRCLを眺める STRING-INVERT (95)

| 22:45 | KMRCLを眺める STRING-INVERT (95) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める STRING-INVERT (95) - わだばLisperになる

今回はKMRCLのstrings.lispから、STRING-INVERTです。

定義は、

(defun string-invert (str)
  "Invert case of a string"
  (declare (optimize (speed 3) (compilation-speed 0) (debug 0) (safety 0))
           (simple-string str))
  (let ((up nil) (down nil))
    (block skip
      (loop for char of-type character across str do
            (cond ((upper-case-p char)
                   (if down (return-from skip str) (setf up t)))
                  ((lower-case-p char)
                   (if up   (return-from skip str) (setf down t)))))
      (if up (string-downcase str) (string-upcase str)))))

となっていて、どうやら文字列中の文字が全部大文字もしくは小文字ならば、ケースを逆にするもののようです。

(KL:STRING-INVERT "foo")
;⇒ "FOO"

(KL:STRING-INVERT "Foo")
;⇒ "Foo"

(KL:STRING-INVERT "FOO")
;⇒ "foo"

(KL:STRING-INVERT "fOO")
;⇒ "fOO"

この動きどこかで覚えがあるなと思ったら、リードテーブルでREADTABLE-CASEを:INVERTにしたときと同じ動きですね。

(LET ((*READTABLE* (COPY-READTABLE NIL)))
  (SETF (READTABLE-CASE *READTABLE*) :INVERT)
  (LIST (READ-FROM-STRING "foo")
        (READ-FROM-STRING "Foo")
        (READ-FROM-STRING "FOO")
        (READ-FROM-STRING "fOO")))
;⇒ (FOO |Foo| |foo| |fOO|)

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100223