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 |

2009-04-20

長さ付きリストで勘違い

| 01:02 | 長さ付きリストで勘違い - わだばLisperになる を含むブックマーク はてなブックマーク - 長さ付きリストで勘違い - わだばLisperになる

風邪か何かの所為か具合が悪いので、先日開催された「型レベルプログラミングの会」のUstreamをぼーっと眺めていたのですが、「長さ付きリスト」というのが耳に残りました。

(defun sized-list (list)
  (if (endp list)
      (cons list 0)
      (cons list (length list))))

(defun sized-list-append (&rest sized-lists)
  (if (endp sized-lists)
      (cons () 0)
      (destructuring-bind ((list . len) &rest rest) sized-lists
        (let ((rest (apply #'sized-list-append rest)))
          (cons (append list (car rest))
                (+ len (cdr rest)))))))

(declaim (inline sized-list-length))
(defun sized-list-length (sized-list)
  (cdr sized-list))
(sized-list '(1 2 3 4))
;=> ((1 2 3 4) . 4)

(sized-list-append
 (sized-list (list 1 2 3 4 5))
 (sized-list (list 6 7 8 9 0)))
;=> ((1 2 3 4 5 6 7 8 9 0) . 10)

(sized-list-length
 (sized-list-append
  (sized-list (list 1 2 3 4 5))
  (sized-list (list 6 7 8 9 0))))
;=> 10

こんな感じのを想像したのですが、全然違うようです(笑)

…その前に元ネタを理解していないのですが(´▽`*)

大元のアイディアはCLだとどういう感じになるんでしょう。

ゲスト



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