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

KMRCLを眺める SUBSTITUTE-CHARS-STRINGS (108)

| 14:11 | KMRCLを眺める SUBSTITUTE-CHARS-STRINGS (108) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める SUBSTITUTE-CHARS-STRINGS (108) - わだばLisperになる

今回はKMRCLのstrings.lispから、SUBSTITUTE-CHARS-STRINGSです。

動作は、

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

となっていて、特定の文字を何らかの文字列に置き換えるもののようです。

定義は、

(defun substitute-chars-strings (str repl-alist)
  "Replace all instances of a chars with a string. repl-alist is an assoc
list of characters and replacement strings."
  (declare (simple-string str)
           (optimize (speed 3) (safety 0) (space 0)))
  (do* ((orig-len (length str))
        (new-string (make-string (replaced-string-length str repl-alist)))
        (spos 0 (1+ spos))
        (dpos 0))
      ((>= spos orig-len)
       new-string)
    (declare (fixnum spos dpos) (simple-string new-string))
    (let* ((c (char str spos))
           (match (assoc c repl-alist :test #'char=)))
      (declare (character c))
      (if match
          (let* ((subst (cdr match))
                 (len (length subst)))
            (declare (fixnum len)
                     (simple-string subst))
            (dotimes (j len)
              (declare (fixnum j))
              (setf (char new-string dpos) (char subst j))
              (incf dpos)))
        (progn
          (setf (char new-string dpos) c)
          (incf dpos))))))

となっているのですが、前回眺めたREPLACED-STRING-LENGTHを利用しています。

前回のREPLACED-STRING-LENGTHはいまいち用途が不明でしたが、このSUBSTITUTE-CHARS-STRINGSの補助関数だったようです。なるほど。

しかし、REPLACED-STRING-LENGTHに括り出している処理と同じような処理が、このSUBSTITUTE-CHARS-STRINGSにも含まれていて、なんとなく微妙です。

ゲスト



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