Я пытаюсь реализовать Metacircular Evaluator на Схеме в соответствии с известной книгой «Структура и интерпретация компьютерных программ» Гарольда Абельсона и Джеральда Джей Суссмана.Metacircular оценщик, реализующий среду
http://mitpress.mit.edu/sicp/full-text/sicp/book/node79.html, http://mitpress.mit.edu/sicp/full-text/sicp/book/node80.html
Авторы предлагают среды установки таким образом:
(define (define-variable! var val env)
(let ((frame (first-frame env)))
(define (scan vars vals)
(cond ((null? vars)
(add-binding-to-frame! var val frame))
((eq? var (car vars))
(set-car! vals val))
(else (scan (cdr vars) (cdr vals)))))
(scan (frame-variables frame)
(frame-values frame))))
(define (setup-environment)
(let ((initial-env
(extend-environment (primitive-procedure-names)
(primitive-procedure-objects)
the-empty-environment)))
(define-variable! 'true true initial-env)
(define-variable! 'false false initial-env)
initial-env))
Однако, я не могу понять, почему
(define myenv (setup-environment))
должны работать, как мы ожидаем, что в схеме, потому что, как я знаю, схема по умолчанию передает переменные на функцию по значению, поэтому после двухкратного применения «define-variable!» к начальному -env, initial-env не будет изменяться каждый раз, а функция setup-environment вернет значение, как вернет-окружение вернет его.
Где моя ошибка в понимании, не могли бы вы посоветовать, пожалуйста?
Спасибо заранее!
Да, многие люди думают, что языки не являются «пропущенными», когда они действительно есть, они просто «pass-reference-by-value». –
Большое спасибо! Вы правы, я был не очень точен в моем вопросе, извините, пожалуйста, за это. В следующий раз попытается стать яснее. –