Метациркулярный оценщик, реализующий среду - PullRequest
3 голосов
/ 16 марта 2012

Я пытаюсь внедрить Metacircular Evaluator в Scheme в соответствии с известной книгой Гарольда Абельсона и Джеральда Джея Сассмана «Структура и интерпретация компьютерных программ».

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))

должен работать так, как мы ожидаем в схеме,потому что, как я знаю, Scheme по умолчанию передает переменные в функцию по значению, поэтому после двухкратного применения «define-variable!» к initial-env, initial-env не будет меняться каждый раз, а функция setup-environment будетверните значение, как его вернул экстент-окружение.

Где моя ошибка в понимании, не могли бы вы посоветовать, пожалуйста?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Ваш вопрос может быть подростком немного более конкретным, но я верю, что понимаю это.

В частности, ваш вопрос выглядит следующим образом:

"Я удивлен поведением

(define myenv (setup-environment))
(define-variable! 'a 13 myenv)
(lookup myenv 'a)

В частности, я ожидал, что он потерпит неудачу, потому что схемаэто вызов по значению. "Это ваш вопрос?

Если так, то я думаю, что смогу ответить на него.Вызов по значению не означает , что значения не могут изменяться.Это просто означает, что вызовы функций предполагают передачу значений от вызывающего к вызываемому.Фактически, почти все языки являются по значению;этот термин широко понимают неправильно.Java, например, также является языком вызова по значению.

Тогда в Scheme нет ничего, что мешало бы вам изменять или "изменять" значение.В этом примере вызов set-car! изменяет список, на который ссылается.Это изменение затем видно любому коду, который может «видеть» это значение.

Я думаю, что ваш фундаментальный вопрос действительно имеет отношение к тому, что означает «вызов по значению», и я надеюсь, что япролить свет на это.

2 голосов
/ 17 марта 2012

Чтобы понять, как это работает, прежде всего вы должны понимать, что переменная initial-env будет указывать на первый кадр среды, и эта ссылка никогда не изменяется,Сама среда представляет собой список кадров, и каждый кадр представляет собой пару списков, car первого кадра является заголовком списка переменных, а cdr первого кадра является заголовком списка.значений.

Как только это станет ясно, вы должны знать, как работают процедуры scan и add-binding-to-frame!.Scan будет искать в текущем кадре, в списке переменных, переменную с тем же именем, что и var;если он найден, он заменит соответствующее значение в списке значений.Если переменная не найдена, add-binding-to-frame! добавит новую переменную и новое значение в заголовки соответствующих списков, обновив фрейм, чтобы указать на эти новые заголовки.Обратите внимание, что initial-environment по-прежнему указывает на первый кадр, а первый кадр по-прежнему указывает на заголовки своих списков переменных и значений (но с новой привязкой).

Итак, теперь вы видите, дажехотя initial-env никогда не менялся, списки, которые он содержит, были изменены на месте, поэтому добавлялись новые переменные с соответствующими значениями.Я полагаю, что лучший способ понять весь процесс - это взять ручку и бумагу и шаг за шагом нарисовать результат изменения соответствующих клеток cons.

...