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

KMRCLを眺める(148) TRIM-NON-ALPHANUMERIC

| 15:53 | KMRCLを眺める(148) TRIM-NON-ALPHANUMERIC - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(148) TRIM-NON-ALPHANUMERIC - わだばLisperになる

前回で一通りstring.lispは眺め終わったと思ったのですが、何点か抜かしていたようなので、順番が前後しつつ、今回はKMRCLのTRIM-NON-ALPHANUMERICです。

動作は、

;; SBCL
(MAPCAR #'KL:TRIM-NON-ALPHANUMERIC
        '("いろはにほへど、"
          "   ちりぬるを、"
          " わかよたれそ、"
          "        つねならむ"))
;⇒ ("いろはにほへど" "ちりぬるを" "わかよたれそ" "つねならむ")

というところで、STRING-TRIMとNON-ALPHANUMERICPが合体したようなもの。

定義は、

(defun trim-non-alphanumeric (word)
  "Strip non-alphanumeric characters from beginning and end of a word."
  (declare (simple-string word)
           (optimize (speed 3) (safety 0) (space 0)))
  (let* ((start 0)
         (len (length word))
         (end len))
    (declare (fixnum start end len))
    (do ((done nil))
        ((or done (= start end)))
      (if (alphanumericp (schar word start))
          (setq done t)
        (incf start)))
    (when (> end start)
      (do ((done nil))
          ((or done (= start end)))
        (if (alphanumericp (schar word (1- end)))
            (setq done t)
          (decf end))))
    (if (or (plusp start) (/= len end))
        (subseq word start end)
      word))

となっていて、左端を算出して、次に右を算出して、SUBSEQで切り出しという感じです。

TRIM-NON-ALPHANUMERICを眺めていて、STRING-TRIM-IFのようなものを誰か考えていそうだなあ、と思ったので調べてみると、METATILITIESに定義がありました。

(MAPCAR (CURRY #'metatilities:STRING-TRIM-IF
               (COMPLEMENT #'ALPHANUMERICP))
        '("いろはにほへど、"
          "   ちりぬるを、"
          " わかよたれそ、"
          "        つねならむ"))
;⇒ ("いろはにほへど" "ちりぬるを" "わかよたれそ" "つねならむ")

個人的にはこういう方がすっきりしてて好みです。

ゲスト



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