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

KMRCLを眺める REPLACED-STRING-LENGTH (107)

| 20:36 | KMRCLを眺める REPLACED-STRING-LENGTH (107) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める REPLACED-STRING-LENGTH (107) - わだばLisperになる

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

動作は、

(KL::REPLACED-STRING-LENGTH "1234567890" '((#\0 . "00")
                                           (#\1 . "11")
                                           (#\2 . "22")
                                           (#\3 . "33")
                                           (#\4 . "44")
                                           (#\5 . "55")
                                           (#\6 . "66")
                                           (#\7 . "77")
                                           (#\8 . "88")
                                           (#\9 . "99")))
;; (LENGTH "11223344556677889900")
⇒ 20

となっていて、なかなか使いどころが思い浮かびませんが、単一の文字を文字列に置き換えた場合の長さを求めるもののようです。

外部にEXPORTはされていません。

定義は、

(defun replaced-string-length (str repl-alist)
  (declare (simple-string str)
           (optimize (speed 3) (safety 0) (space 0)))
    (do* ((i 0 (1+ i))
          (orig-len (length str))
          (new-len orig-len))
         ((= i orig-len) new-len)
      (declare (fixnum i orig-len new-len))
      (let* ((c (char str i))
             (match (assoc c repl-alist :test #'char=)))
        (declare (character c))
        (when match
          (incf new-len (1- (length
                             (the simple-string (cdr match)))))))))

となっていて、単純に文字列を走査してゆき該当の文字と文字列の対応が与えたALIST中にあれば文字列の長さ分を加えるというもののようです。

ゲスト



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