Как настроена машина! изменить мою среду закрытия?
Я пишу метациклический интерпретатор и пытаюсь реализовать замыкания. У меня есть функция make-lambda, которая осуществляет замыкание:
(define (make-lambda parameters body env)
(list 'lambda parameters body env)
)
И функция, которая обрабатывает определения, в которых у меня есть проверка, содержит ли определение лямбду, и в этом случае мне нужно будет создать замыкание:
(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! вызов. Любая помощь будет оценена по достоинству.
Я пробовал все виды устранения неполадок, некоторые из них есть в приведенном выше коде, но до сих пор не знаю, что происходит.