Изменение компилятора с явным кодированием
В этом разделе мы в основном говорили о том, как с помощью окружения времени компиляции порождать лексические адреса. Однако такие окружения можно использовать и другими способами. Например, в упражнении 5.38 мы повысили эффективность скомпилированного кода путем явного кодирования элементарных процедур. Наша реализация обрабатывала имена явно кодируемых процедур как зарезервированные слова. Если бы какая-либо программа переопределяла такое имя, механизм, описанный в упражнении 5.38 , продолжал бы явно кодировать его как примитив и игнорировал бы новое связывание. Рассмотрим, например, процедуру
(lambda (+ * a b x y)
(+ (* a x) (* b y)))
которая вычисляет линейную комбинацию
x
и
y
. Мы могли бы вызвать такую процедуру с аргументами
+matrix
,
*matrix
и четырьмя матрицами, но явно кодирующий компилятор по-прежнему вставлял бы код для
+
и
*
в
(+ (* a x) (* b y))
как для примитивов
+
и
*
. Измените компилятор с явным кодированием так, чтобы он проверял окружение времени компиляции и на его основе порождал правильный код для выражений, в которых встречаются имена элементарных процедур. (Код будет работать правильно, пока программа не применяет к этим именам
define
или
set!
.)
Комментарии отсутствуют.