21012009 lisp
On Lisp15章。マクロで遅延評価を実装
(defconstant unforced (gensym))
(defstruct delay forced closure)
(defmacro delay (expr)
(let ((self (gensym)))
`(let ((,self (make-delay :forced unforced)))
(setf (delay-closure ,self)
#'(lambda () (setf (delay-forced ,self) ,expr))) ,self)))
(defun force(x)
(if (delay-p x)
(if (eq (delay-forced x) unforced)
(funcall (delay-closure x))
(delay-forced x))
x))
これを使う場合
(let ((x 2))
(setq d (delay (1+ x))))
そのままでは評価されない
d
#S(DELAY :FORCED #:G748 :CLOSURE #<CLOSURE (LAMBDA #) {12234AF5}>)
forceしてやる
(force d)
3
On Lisp
ビジネスプロフェッショナルの仕事力
SANYO ハイビジョン対応 デジタルムービーカメラ Xacti (ザクティ) ブラック DMX-HD1010(K)
Eye-Fi Share SD型ワイヤレスメモリカード 日本版(正規品)
On Lisp
だれかに話したくなる小さな会社
フリーター論争2.0―フリーターズフリー対談集
コミュニティ・カフェをつくろう!
グーグル―Google 既存のビジネスを破壊する 文春新書 (501)
実践Common Lisp