4

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

4

1 に答える 1