let как производная форма от lambda
Выражение let можно преобразовать в применение lambda, сохраняя ядро вычислителя более компактным и поддерживая то же поведение связывания.
Что должно оставаться неизменным при переписывании let в виде применения lambda?
- Отделение внешнего синтаксиса от базовых форм вычислителя
- Сбор имен связываний в качестве параметров lambda
- Сбор выражений связываний в качестве операндов применения
- Вычисление преобразованного выражения в исходном окружении
Трансформатор берет имена связываний из let и помещает их в список параметров lambda. Он помещает тело let в эту lambda и размещает выражения связываний после lambda в качестве операндов применения.
Вычислителю не требуется вторая реализация локального связывания. Его случай let переписывает выражение и отправляет результат обратно через обычные случаи lambda и применения в том же окружении.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает ((lambda (x y) (+ x y)) 10 32). Вторая возвращает 42.
Во втором запуске найдите диспетчеризацию let и вызовы трансформатора перед созданием lambda. Последующее применение расширяет окружение переменными x и y, затем вычисляет исходное тело.
Измените программу и сравните результат.
Добавьте связывание z со значением 8 и измените тело на (+ (+ x y) z). Предскажите как преобразованное выражение, так и его значение.
Показать подсказку
Списки параметров и операндов увеличиваются в одинаковом порядке. Тело остается одним выражением внутри lambda.