sicp.io
4.1.1 · Ядро вычислителя

Ядро метациклического вычислителя eval и apply

Синтаксические предикаты, операции с окружениями, записи составных процедур, вычисление аргументов и последовательностей связывают eval и apply.

Вопрос для размышления

Какие обязанности принадлежат eval, какие принадлежат apply и какие структуры данных связывают их между собой?

  • Классификация самовычисляющихся значений, переменных, специальных форм и применений
  • Направление присваивания, определения, if, lambda, begin и quote к отдельным правилам
  • Вычисление оператора и его операндов перед применением в аппликативном порядке
  • Применение примитива хоста или представленной составной процедуры
  • Расширение захваченного лексического окружения для каждого составного применения
  • Разделение управления вычислителем и программы guest, представленной в виде данных

Процедура evaluate является центральным диспетчером синтаксиса. Прямые значения возвращают сами себя, имена используют поиск в окружении, специальные формы получают собственные правила вычисления, а каждая оставшаяся пара рассматривается как применение. Ветка применения вычисляет выражения оператора и операндов, а затем передает полученную процедуру и значения аргументов в apply-procedure.

Процедура apply-procedure принимает уже классифицированные значения процедур. Процедура хоста получает список аргументов через apply. Запись compound-procedure предоставляет параметры, выражения тела и окружение своего создания, а применение расширяет это окружение новым кадром и вычисляет последовательность тела. Повторно используемый канонический драйвер выполняет каждую базовую форму в одном постоянном окружении guest и делает наглядным учебный цикл eval/apply.

Код SICP7,837 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Полный запуск возвращает (complete ((defined square) (defined make-adder) (defined add-five) (defined base) 49 12 (assigned base) 81 6) 0). Запуск с бюджетом в пять форм возвращает (truncated ((defined square) (defined make-adder) (defined add-five) (defined base) 49) 4).

    На что обратить внимание в трассе

    Для каждой формы guest начинайте с evaluate и определите выбранную ветку. При применениях разделяйте вычисление оператора, построение list-of-values слева направо и вызов apply-procedure. Проследите за каждой составной процедурой в новом кадре, связанном с окружением из ее записи процедуры. Бюджет форм верхнего уровня относится к драйверу и не входит в eval или apply.

    Попробуйте сами

    Измените программу и сравните результат.

    Добавьте выражение guest begin, первая форма которого изменяет base, а последняя форма вызывает add-five. Перед запуском определите каждую ветку evaluate и одну ветку apply-procedure, которые использует новая форма.

    Показать подсказку

    Форма begin делегирует выполнение в eval-sequence. Форма set! изменяет существующий кадр, в то время как add-five остается составной процедурой, несущей окружение, созданное make-adder.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%