Должна ли ленивая оценка set! быть на самом деле строгим?

#scheme #sicp

#схема #sicp

Вопрос:

В книге SICP описывается, как реализовать интерпретатор Scheme в Scheme. Я играю с этим и выключаю уже несколько месяцев, и мой код эволюционировал от книги. Теперь я достиг стадии, когда, внедрив strict-eval процедуру, я пытаюсь реализовать lazy-eval аналог, который всегда возвращает ‘thunk’ (некоторый объект, инкапсулирующий выражение и информацию о среде и запоминании). У меня есть force-thunk процедура, которая оценивает thunk с запоминанием. Моя быстрая и грязная реализация в настоящее время возвращает оболочку thunk вокруг set! выражения, и, конечно, это приводит к странной семантике (никакого побочного эффекта не возникает, пока thunk не будет принудительно выполнен). У меня очень возникает соблазн изменить это, и моя lazy-eval процедура должна быть строгой для set! выражений. На самом деле, чтобы быть более точным, я подумываю о том, чтобы отложить оценку присваиваемого выражения (поэтому создайте из него блок), но не откладывать изменение привязки (т. Е. Немедленно Назначить символ новому блоку в среде). Есть ли какая-либо причина, по которой я должен отложить побочный эффект?

Комментарии:

1. Создание set! (и нескольких других примитивов) строгого, но не принудительного значения, похоже, является путем, который выбрал ленивый ракетка .

Ответ №1:

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

 (define x expression) ; ==> x is a thunk
(set! x (  x x)       ; ==> x is a new thunk that references the old `x`
(display x)           ; display would force the evaluation of the nested thunks referenced by `x`
  

Если вы отложите фактическую фазу привязки, то приведенный выше код никогда не будет принудительно возвращать возвращаемое значение из set! -expression поскольку оно никогда не используется и, следовательно x , будет принудительно введенным старым thunk display ?