SICP セクション 3.5.1 で遅延ストリームを実装したい
まず、この2つの関数を定義しました
(defmacro delay (form)
`(lambda () ,form))
(defun force (form)
(when form
(funcall form)))
私たちが電話したとき:
(force (delay '(+ 1 2)))
;;=> (+ 1 2)
(force (delay (+ 1 2)))
;;=> 3
それでうまくいきました。次に、「stream-cons」の定義を続けますが、今回は 2 つの方法があるようです。
(defmacro stream-cons (a b)
`(cons ,a ,(delay b)))
(defmacro stream-cons (a b)
`(cons ,a (delay ,b)))
私はそれらが違うとは思わないが、私は間違っている!呼び出されたときの間違った版である初版:
(force (cdr (stream-cons 'a (progn (print "hello") 2))))
;;=> (PROGN (PRINT "hello") 2)
(macroexpand '(stream-cons 'a (progn (print "hello") 2)))
;;=> (CONS 'A #<CLOSURE (LAMBDA # :IN STREAM-CONS) {25ABB3A5}>)
そして、第 2 版は、次のように呼ばれます。
(force (cdr (stream-cons 'a (progn (print "hello") 2))))
;;
;; "hello"
;; => 2
(macroexpand '(stream-cons 'a (progn (print "hello") 2)))
;;=> (CONS 'A (DELAY (PROGN (PRINT "hello") 2)))
今、私はとても混乱しています。2つの違いを明確にするために、誰が親切に助けてくれますか? どうもありがとう!
私の環境: Windows 32 ビット、SBCL 1.1.4