
348
Глава 4. Метаязыковая абстракция
(sequence->exp (cond-actions first))
(expand-clauses rest))))))
Выражения (вроде cond), которые мы желаем реализовать через синтаксические пре-
образования, называются производными (derived expressions). Выражения let также
являются производными (см. у пражнение 4.6)
13
.
Упражнение 4.2.
Хьюго Дум хочет переупорядочить ветви cond так, чтобы ветвь для вызова процедур распо-
лагалась перед веткой для присваивания. Он утверждает, что при этом интерпретатор с танет
эффективнее: поскольку в программах обычно больше вызовов процедур, чем присваиваний, опре-
делений и т. д., его усовершенствованный eval обычно будет рассматривать меньше вариантов,
чем исходный, при распознавании типа выражения.
а. Что за ошибка содержится в плане Хьюго? (Подсказка: что сделает его интерпретатор с
выражением (define x 3)?)
б. Хьюго расстроен, что его план не с работал. Он го тов пойти на любые жертвы, чтобы поз-
волить интерпретатору распознавать вызовы процедур до того, как он проверяет все остальные
типы выражений. Помогите ему, изменив синтаксис интерпретируемого языка так, чтобы вызовы
процедур начинались с символа call. Например, вместо (factorial 3) нам теперь придется
писать (call factorial 3), а вместо (+ 1 2) — (call + 1 2).
Упражнение 4.3.
Перепишите eval так, чтобы диспетчеризация происходила в стиле, управляемом данными. Срав-
ните результат с дифференцированием, управляемым данными, из у пражнения 2.73. (Можно ис-
пользовать car составного выражения в качестве типа этого выражения, так как это хорошо
сочетается с синтаксисом, р еализованным в этом разделе.)
Упражнение 4.4.
Вспомним определения особых форм and и or из главы 1 :
• and: выражения вычисляются слева направо. Если значение какого-то из них оказывается
ложным, возвращается ложь; оставшиеся выражения не вычисляются. Если все выражения ока-
зываются истинными, возвращается значение последнего из них. Если нет ни одного выражения,
возвращается истина.
• or: выражения вычисляются слева направо. Если значение какого-то из них оказывается
истинным, возвращается это значение; оставш иеся выражения не вычисляются. Если все выраже-
ния оказываются ложными, или нет ни одного выражения, возвращается ложь.
Введите and и or в качестве новых особых форм интерпр етатора, определив соответствующие
синтаксические процедуры и процедуры выполнения eval-and и eval-or. В качестве альтерна-
тивы покажите, как можно реализовать and и or в виде производных выражений.
13
Практические Лисп-системы предоставляют механизм, который дает пользователю возможность добавлять
новые производные выражения и определять их значения через синтаксические преобразования, не внося из-
менений в вычислитель. Такое преобразован ие, определяемое пользователем, называется макрос (macro). До-
бави ть простой механизм для определения макросов легко, однако в получающемся языке возникают сложные
проблемы конфликта имен. Множество исследований посвящено поиску механизмов определения макросов, в
которых такие проблемы не возникают. См., например, Kohlbecker 1986, Clinger and Rees 1991 и Hanson 1991 .