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

KMRCLを眺める PRINT-SEPARATED-STRINGS (115)

| 23:36 | KMRCLを眺める PRINT-SEPARATED-STRINGS (115) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める PRINT-SEPARATED-STRINGS (115) - わだばLisperになる

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

動作は、

(DEFVAR *STRINGS*
  '(("い" "ろ" "は" "に" "ほ" "へ" "と")
    ("ち" "り" "NULL" "を")
    ("わ" "か" "よ" "た" "れ" "そ")))

(APPLY #'KL:PRINT-SEPARATED-STRINGS *STANDARD-OUTPUT*
       ","
       *STRINGS*))
→ い,ろ,は,に,ほ,へ,と,ち,り,NULL,を,わ,か,よ,た,れ,そ
⇒ #<SB-IMPL::STRING-OUTPUT-STREAM {100D1D8961}>

という風にリストのリストに格納された文字列をセパレータ文字列で区切ってストリームに出力するものです。

定義は、

(defun print-separated-strings (strm separator &rest lists)
  (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)
                     (compilation-speed 0)))
  (do* ((rest-lists lists (cdr rest-lists))
        (list (car rest-lists) (car rest-lists))
        (last-list (only-null-list-elements-p (cdr rest-lists))
                   (only-null-list-elements-p (cdr rest-lists))))
       ((null rest-lists) strm)
    (do* ((lst list (cdr lst))
          (elem (car lst) (car lst))
          (last-elem (null (cdr lst)) (null (cdr lst))))
         ((null lst))
      (write-string elem strm)
      (unless (and last-elem last-list)
        (write-string separator strm)))))

という風にリストのリストからリストを順に取り出して、中のDO*でリストを回して処理するというものです。

前回眺めたONLY-NULL-LIST-ELEMENTS-Pはこの関数の外側のループで使うことを意図していたようです。

ゲスト



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