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 |

2008-06-11

TCONC

| 13:54 | TCONC - わだばLisperになる を含むブックマーク はてなブックマーク - TCONC - わだばLisperになる

先日のCL勉強会で、TCONCのことを知ったのですが、TCONCの解説で、古いINTERLISPのマニュアルでTCONCをリストで表現していたのが気に入ったので、作ってみることにしました。

TCONCという構造は、リストとリストの末尾のペアをすぐ取り出せる構造なので、末尾への要素の追加のコストが低いというのが特長です。

今回再現してみるリスト表現のTCONCは、CARにリスト、CDRに末尾のペアのポインタを保持する構造になっています。

つまり

(1 2 3 4)

というリストならば、

((1 2 3 4) . (4)) 
 ≡ ((1 2 3 4) 4) 

となります。

見た目はリストなので、ちょっと区別し難かったりしますが、なるほど!という表現で、どんなにリストが長くても、TCONCをCDRすれば、末尾のペアが取り出せます。

ちなみに、PCLのLOOP章の註釈で解説があるのですが、LOOPマクロのcollectもTCONCなことが多いのかもしれません。

INTERLISP-10のマニュアルには、TCONCの他にリストとリストを継ぐLCONC、CONSと似ていますが、リストのポインタは変化しないATTACHの解説もあり、これも面白そうなのでついでに作ってみました。

;; tconcの動作
(loop :with start := 1 :and end := 10
      :with tc := (tconc () start)
      :for i :from (1+ start) :to end :do (tconc tc i) 
      :finally (return (car tc)))

;==> (1 2 3 4 5 6 7 8 9 10)

;; lconcの動作
(loop :with start := 1 :and end := 10
      :with lc := (lconc (list ()) (list start))
      :for i :from (1+ start) :to end :do (lconc lc (list i)) 
      :finally (return (car lc)))

;==> (1 2 3 4 5 6 7 8 9 10)

;; attachの動作
(setq foo (list 100))

(eq foo (attach 0 foo))
;==> T

foo
;==> (0 100)

;; 定義
(defpackage #:tconc
  (:use #:cl)
  (:export #:tconc
           #:lconc
           #:attach))

(in-package :tconc)

(defun TCONC (ptr x)
  (declare (list ptr))
  (let ((x (list x)))
    (if (null ptr)
        (cons x x)
        (progn (psetf (cddr ptr) x             
                      (cdr ptr) x)
               ptr))))

(defun LCONC (ptr x)
  (declare (cons ptr x))
  (let ((last (last x)))
    (rplaca ptr (nconc (car ptr) x))
    (rplacd ptr last)))

(defun ATTACH (x y)
  (declare (cons y))
  (let ((ptr y)
        (tail (cons (car y) (cdr y))))
    (setf (car ptr) x
          (cdr ptr) tail)
    ptr))

第3回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 06:44 | 第3回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 第3回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

とりあえず、意味なく毎週Lingrでオンライン勉強会を開くことにしてみたのですが、次回は、若干細切れにしてみることにしました。

今回、お題は全部で3つ。1枠25分+休憩5分で時間の枠に収まらなかった場合、次回へ持ち越しとなります。

お題としては、

  • マクロ
  • コンディションシステム
  • Lispマシン

「興味があるものだけ、参加してみよう!」という感じにしてみました。

場所:Lingr: Common Lisp部屋
日時6/14 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-20:25THE POWER OF LISP MACROS (Edi Weitz氏)CLマクロ入門者的な方macros.lisp
20:30-20:55「Common Lisp における例外処理 〜Condition System の活用〜」(数理システムさん)CLのコンディションシステム入門者的な方(PDF)
21:00-21:25LISPマシン入門Lispマシンって何だか知りたい方適当に準備します
21:25-反省/質問/お題の提案/雑談

また、現在

  • LISPの落し穴(コーディングではまるところ)
  • LISPとデザインパターン
  • LOOPマクロ入門
  • FORMAT入門

のようなものをお題にすることを考えています。

また、「こういうのを勉強してみたい!」というのがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみる、もしくは、時間枠を差し上げますので、そのテーマの進行役になって進めて下さい(笑)

ゲスト



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