Как настроена машина! изменить мою среду закрытия?

Я пишу метациклический интерпретатор и пытаюсь реализовать замыкания. У меня есть функция 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! вызов. Любая помощь будет оценена по достоинству.

Я пробовал все виды устранения неполадок, некоторые из них есть в приведенном выше коде, но до сих пор не знаю, что происходит.

0 ответов

Другие вопросы по тегам