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

KMRCLを眺める(145) SPLIT-ALPHANUMERIC-STRING

| 14:07 | KMRCLを眺める(145) SPLIT-ALPHANUMERIC-STRING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(145) SPLIT-ALPHANUMERIC-STRING - わだばLisperになる

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

前回の LEX-STRING はデリミタが空白/改行文字でしたが、今回は、 non alpanumetricな文字が区切りになります

(KL:SPLIT-ALPHANUMERIC-STRING "いろはにほへと,ちりぬるを,わかよたれそ,つねならむ")
=> ("いろはにほへと" "ちりぬるを" "わかよたれそ" "つねならむ")

というところです。

定義も殆ど同じで、LEX-STRINGと2行位違うだけで

(defun split-alphanumeric-string (string)
  "Separates a string at any non-alphanumeric chararacter"
  (declare (simple-string string)
           (optimize (speed 3) (safety 0)))
  (flet ((is-sep (char)
           (declare (character char))
           (and (non-alphanumericp char)
                (not (char= #\_ 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)))))

となっています。

なんとなく、コピペ的に似たような関数を書くよりは、区切りを判定する関数を受けとる関数を書く方すっきりする気がします。

(SPLIT-STRING "いろはにほへと ちりぬるを,わかよたれそ,つねならむ")
              :TEST #'KL:NON-ALPHANUMERICP)
=> ("いろはにほへと" "ちりぬるを" "わかよたれそ" "つねならむ")

のような感じで。

ゲスト



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