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-03-22

KMRCLを眺める STRING-TO-LIST-SKIP-DELIMITER (122)

| 21:05 | KMRCLを眺める STRING-TO-LIST-SKIP-DELIMITER (122) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める STRING-TO-LIST-SKIP-DELIMITER (122) - わだばLisperになる

今回はKMRCLのstrings.lispから、STRING-TO-LIST-SKIP-DELIMITERです。

動作は、

(KL:STRING-TO-LIST-SKIP-DELIMITER "foo,bar,,,,,,,,baz,,quux" #\,)
⇒ ("foo" "bar" "baz" "quux")

というところ。

定義は、

(defun string-to-list-skip-delimiter (str &optional (delim #\space))
  "Return a list of strings, delimited by spaces, skipping spaces."
  (declare (simple-string str)
           (optimize (speed 0) (space 0) (safety 0)))
  (do* ((results '())
        (end (length str))
        (i (position-not-char delim str 0 end)
           (position-not-char delim str j end))
        (j (when i (position-char delim str i end))
           (when i (position-char delim str i end))))
       ((or (null i) (null j))
        (when (and i (< i end))
          (push (subseq str i end) results))
        (nreverse results))
    (declare (fixnum end)
             (type (or fixnum null) i j))
    (push (subseq str i j) results)))

という風に以前に眺めたPOSITION-CHARとPOSITION-NOT-CHARで文字列の位置を割り出して文字列を切り出すという感じです。

ゲスト



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