我想在 SICP 3.5.1 节中实现惰性流
首先,我定义了这两个函数
(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',但这一次似乎有两种方法:
(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}>)
和第二版,这是正确的,当被称为:
(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)))
现在,我很困惑。谁能帮我弄清楚两者的不同之处?非常感谢!
我的环境:Windows 32 位,SBCL 1.1.4