我正在编写一个元循环解释器,并尝试实现闭包。我有一个函数 make-lambda 可以实现闭包:
(define (make-lambda parameters body env)
(list 'lambda parameters body env)
)
还有一个处理定义的函数,我在其中检查定义是否包含 lambda,在这种情况下我需要创建一个闭包:
(let* ((closure (make-lambda (cadadr defn) (cddadr defn) env)) ; creates a closure
(var (car defn))
(binding `(,var . ())))
(display closure)
(newline)
(display "CLOSURE BEFORE: ")
(display (cadddr closure))
(newline)
(set-car! env (cons binding (car env)))
(display "CLOSURE AFTER: ")
(display (cadddr closure)) ; why is this different?
(newline)
;(set-cdr! binding (meta-eval error (cadddr closure) ))
;(set-cdr! binding closure)
(display "NORMAL: ")
(display env)
(newline)
)
我似乎无法弄清楚为什么 cadddr 关闭在 set-car 之前和之后不同!称呼。任何帮助将不胜感激。
我已经尝试了各种故障排除方法,并且在上面的代码中有一些,但仍然不知道发生了什么。
cadddr
的closure
是另一个指向env
的指针,从make-lambda
的定义可以看出。由于您已经修改了 env
指向的列表,因此对它的所有引用(env
和 (cadddr closure)
)都将反映更改后的列表。