Изменение компилятора с явным кодированием

В этом разделе мы в основном говорили о том, как с помощью окружения времени компиляции порождать лексические адреса. Однако такие окружения можно использовать и другими способами. Например, в упражнении 5.38 мы повысили эффективность скомпилированного кода путем явного кодирования элементарных процедур. Наша реализация обрабатывала имена явно кодируемых процедур как зарезервированные слова. Если бы какая-либо программа переопределяла такое имя, механизм, описанный в упражнении 5.38 , продолжал бы явно кодировать его как примитив и игнорировал бы новое связывание. Рассмотрим, например, процедуру

(lambda (+ * a b x y)
  (+ (* a x) (* b y)))

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


Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход