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-04-24

KMRCLを眺める(144) LEX-STRING

| 17:24 | KMRCLを眺める(144) LEX-STRING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(144) LEX-STRING - わだばLisperになる

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

動作は、以前眺めた DELIMITED-STRING-TO-LIST と大体同じですが、LEX-STRINGは空白文字を複数指定できるところが違うようです。(デフォルトだと、#\Spaceと#\Newline)

(SUBSEQ (KL:LEX-STRING (KL:READ-FILE-TO-STRING "/usr/share/dict/words")
                       :WHITESPACE '(#\Newline))
        10000
        10010)
⇒ ("Loyola" "Loyola's" "Lr" "Lt" "Lt's" "Ltd" "Ltd's" "Lu" "Lu's" "Luanda")

という感じで、定義は

(defun lex-string (string &key (whitespace '(#\space #\newline)))
  "Separates a string at whitespace and returns a list of strings"
  (flet ((is-sep (char) (member char whitespace :test #'char=)))
    (let ((tokens nil))
      (do* ((token-start
             (position-if-not #'is-sep string)
             (when token-end
               (position-if-not #'is-sep string :start (1+ token-end))))
            (token-end
             (when token-start
               (position-if #'is-sep string :start token-start))
             (when token-start
               (position-if #'is-sep string :start token-start))))
           ((null token-start) (nreverse tokens))
        (push (subseq string token-start token-end) tokens)))))

です。

DOの中身が長くなるので縦に伸びています。

ゲスト



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