sicp.io
4.1.7 · Запуск вычислителя как программы

Запуск программы в вычислителе с общим окружением

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

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

Что превращает набор процедур вычислителя в программу, способную выполнять последовательность пользовательских форм?

  • Разделение выполнения хоста Lispex и выражений guest, представленных в виде данных
  • Диспетчеризация самовычисляющихся значений, переменных, специальных форм и применений
  • Применение примитивных процедур хоста и представленных составных процедур
  • Сохранение определений и присваиваний в одном явном глобальном окружении
  • Наблюдение захвата лексического замыкания при последующих глобальных изменениях
  • Формирование отчета о полном или усеченном конечном запуске драйвера верхнего уровня
  • Разделение бюджета форм верхнего уровня и объема работы внутри одной формы

Вычислитель представляет окружения как списки изменяемых кадров. Поиск переменной guest просматривает эти кадры, define изменяет первый кадр, а set! ищет существующее связывание и изменяет эту запись. Форма guest lambda становится записью составной процедуры, содержащей параметры, выражения тела и окружение, в котором вычислялась эта lambda. Процедура apply-procedure либо применяет примитив хоста, либо вычисляет составное тело в новом кадре.

Процедура run-program служит драйвером. Она принимает цитированные формы верхнего уровня, одно явное глобальное окружение и бюджет форм. Каждая завершенная форма добавляет одно значение в transcript, при этом определения и присваивания остаются видимыми для последующих форм. Полный запуск определяет square, make-adder, add-five и base, а add-five сохраняет локальное значение x равным 5 даже после изменения глобальной переменной base. Второй запуск останавливается после пяти форм и сообщает, что четыре формы еще ожидают обработки. Этот бюджет форм не ограничивает рекурсию или работу внутри одной формы, а ограничения выполнения более низкого уровня по-прежнему обеспечивает упакованная среда выполнения браузера.

Код 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).

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

    Отделяйте вызовы хоста, реализующие evaluate и apply-procedure, от выражений guest, сохраненных в guest-program. Проследите за изменением глобального кадра при выполнении define и set!, за новым кадром, создаваемым для каждого составного применения, и за окружением, захваченным add-five. В run-program одна единица бюджета расходуется только после возврата формы верхнего уровня, и этот счетчик не измеряет рекурсивную работу guest внутри этой формы.

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

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

    Добавьте определение guest (define (twice procedure value) (procedure (procedure value))) и вычислите (twice add-five 1). Спрогнозируйте новое значение transcript и количество оставшихся форм при сохранении бюджета форм равным 5.

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

    Полный запуск применяет add-five дважды, поэтому результат guest равен 11. В запуске с бюджетом в пять форм вставка еще одной формы после существующих определений меняет то, какое выражение станет пятой завершенной формой.

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

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