定车怎么样!修改我的关闭环境?

问题描述 投票:0回答:1

我正在编写一个元循环解释器,并尝试实现闭包。我有一个函数 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 之前和之后不同!称呼。任何帮助将不胜感激。

我已经尝试了各种故障排除方法,并且在上面的代码中有一些,但仍然不知道发生了什么。

scheme meta metacircular
1个回答
0
投票

cadddr
closure
是另一个指向
env
的指针,从
make-lambda
的定义可以看出。由于您已经修改了
env
指向的列表,因此对它的所有引用(
env
(cadddr closure)
)都将反映更改后的列表。

© www.soinside.com 2019 - 2024. All rights reserved.