sicp.io
4.1.4 · Производный синтаксис

let как производная форма от lambda

Выражение let можно преобразовать в применение lambda, сохраняя ядро вычислителя более компактным и поддерживая то же поведение связывания.

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

Что должно оставаться неизменным при переписывании let в виде применения lambda?

  • Отделение внешнего синтаксиса от базовых форм вычислителя
  • Сбор имен связываний в качестве параметров lambda
  • Сбор выражений связываний в качестве операндов применения
  • Вычисление преобразованного выражения в исходном окружении

Трансформатор берет имена связываний из let и помещает их в список параметров lambda. Он помещает тело let в эту lambda и размещает выражения связываний после lambda в качестве операндов применения.

Вычислителю не требуется вторая реализация локального связывания. Его случай let переписывает выражение и отправляет результат обратно через обычные случаи lambda и применения в том же окружении.

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

    Первая программа возвращает ((lambda (x y) (+ x y)) 10 32). Вторая возвращает 42.

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

    Во втором запуске найдите диспетчеризацию let и вызовы трансформатора перед созданием lambda. Последующее применение расширяет окружение переменными x и y, затем вычисляет исходное тело.

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

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

    Добавьте связывание z со значением 8 и измените тело на (+ (+ x y) z). Предскажите как преобразованное выражение, так и его значение.

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

    Списки параметров и операндов увеличиваются в одинаковом порядке. Тело остается одним выражением внутри lambda.

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

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