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

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

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

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

PerlやRubyでいうsplitのようです。

(defun delimited-string-to-list (string &optional (separator #\space)
                                                  skip-terminal)
  "split a string with delimiter"
  (declare (optimize (speed 3) (safety 0) (space 0) (compilation-speed 0))
           (type string string)
           (type character separator))
  (do* ((len (length string))
        (output '())
        (pos 0)
        (end (position-char separator string pos len)
             (position-char separator string pos len)))
       ((null end)
        (if (< pos len)
            (push (subseq string pos) output)
            (when (or (not skip-terminal) (zerop len))
              (push "" output)))
        (nreverse output))
    (declare (type fixnum pos len)
             (type (or null fixnum) end))
    (push (subseq string pos end) output)
    (setq pos (1+ end))))

前回、前々回と定義していた、POSITION-(NOT-)CHARを利用しています。

この場合は、文字列の長さを越えてアクセスしていないので前回、前々回触れた問題には遭遇しません。

動作例は、

(KL:DELIMITED-STRING-TO-LIST "foo bar baz")
;⇒ ("foo" "bar" "baz")

(KL:DELIMITED-STRING-TO-LIST "foo,bar,baz" #\,)


(KL:DELIMITED-STRING-TO-LIST "foo,bar,baz," #\, 'T)
;⇒ ("foo" "bar" "baz")

(KL:DELIMITED-STRING-TO-LIST "foo,bar,baz," #\, NIL)
("foo" "bar" "baz" "")

というところでしょうか。デリミタ文字が最後に来る場合の処理を(&OPTIONAL SKIP-TERMINAL)で選択できます。

ゲスト



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