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-21

KMRCLを眺める STRING-DELIMITED-STRING-TO-LIST (121)

| 20:10 | KMRCLを眺める STRING-DELIMITED-STRING-TO-LIST (121) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める STRING-DELIMITED-STRING-TO-LIST (121) - わだばLisperになる

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

動作は、

(MAPCAR #'KL:STRING-TRIM-WHITESPACE 
        (KL:STRING-DELIMITED-STRING-TO-LIST 
         "foo, 
          bar, 
          baz" ","))
⇒ ("foo" "bar" "baz")

というところ。

定義は、

(defun string-delimited-string-to-list (str substr)
  "splits a string delimited by substr into a list of strings"
  (declare (simple-string str substr)
           (optimize (speed 3) (safety 0) (space 0) (compilation-speed 0)
                     (debug 0)))
  (do* ((substr-len (length substr))
        (strlen (length str))
        (output '())
        (pos 0)
        (end (fast-string-search substr str substr-len pos strlen)
             (fast-string-search substr str substr-len pos strlen)))
       ((null end)
        (when (< pos strlen)
          (push (subseq str pos) output))
        (nreverse output))
    (declare (fixnum strlen substr-len pos)
             (type (or fixnum null) end))
    (push (subseq str pos end) output)
    (setq pos (+ end substr-len))))

となっていて、前回のFAST-STRING-SEARCHが文字列の切り出しの位置を調べるのに使われています。