Cтраница 2
Применения таких функций записываются в префиксной форме, а не в инфиксной, как в языках Норе и Miranda. Это делает синтаксис применения примитивной функции идентичным синтаксису применения функции пользователя. [16]
Символ обозначает присоединение, так что в третьем снизу уравнении кодовые последовательности С и С1 соединяются вместе. Последнее уравнение дает правило для применения примитивной функции плюс; ясно, что при введении каждой новой примитивной функции должно добавляться по крайней мере одно новое уравнение. Работа КАМ иллюстрируется редукцией в рамках слабой ККЛ выражения М, рассмотренного выше, которое применяется к пустому контексту. [17]
Заметим, что указатель AFT не изменяется, указывая на - вершину, к которой нужно вернуться после вычисления аргумента. Подобным образом левый указатель этой вершины по-прежнему направлен вверх по гребню в сторону вершины редекса применения примитивной функции. Однако правый указатель теперь направлен вниз по гребню. Аргумент, который необходимо вычислить следующим ( если он есть), будет определен б-правилами применяемой примитивной функции и текущим состоянием при выполнении этих правил. [18]
![]() |
Обработка вершин-синонимов при сборке мусора. [19] |
Теперь мы опишем, как можно сконструировать функцию редукции графов для вычисления выражений нашего расширенного - исчисления, которое включает константы и примитивные функции. Однако один вопрос, который до сих пор подробно не рассматривался, - это вопрос о спуске по гребню при применении примитивной функции и о подъеме ( вверх по гребню), необходимом при вычислении аргументов примитивной функции для завершения ее применения. Одна из причин того, что мы опустили детали реализации спуска / подъема, заключается в том, что простой метод, основанный на использовании стека, хорошо работает в этом случае. [20]
Подъем, в сущности, противоположен спуску; FORE и AFT в алгоритме подъема обмениваются своими ролями. Цикл прекращается после заданного числа шагов в случае нахождения вершины-редекса аргумента или, когда AFT примет значение NULL при достижении редекса применения примитивной функции после завершения ее вычисления. [21]
Преобразования графа показаны на рис. 11.5. Мусор не показан, а корневая вершина очередного редекса помечена символом в каждом графе. Подстановка приводит к графу ( б), где разделение выражения аргумента очевидно. Последние три шага редукции определяются правилами применения примитивных функций и могут быть рассмотрены после прочтения следующего параграфа. Однако преобразования графа являются очень простыми и вполне очевидными: редекс графа ( г) является первым аргументом строгой примитивной функции -) -, а следующие две редукции являются просто применениями примитивной функции () к постоянным аргументам. [22]
В этом синтаксисе каждое выражение находится в чисто аппли-кативной форме и поэтому может быть представлено графом, в котором единственным типом внутренних вершин являются - вершины. Строго говоря, в этом случае не существует Х - вер-шин, но мы по-прежнему можем допустить существование вершин конструкторов данных. Однако единственными правилами редукции, работающими с такими вершинами, являются применения функций конструкторов и селекторов. В первом случае будет создана новая вершина конструктора, а применение селектора представляется точно так же, как применение любой другой примитивной функции или комбинатора. Никакого копирования не выполняется, и единственным специальным действием является оптимизация, которая меняет порядок выбора редек-сов и может вводить вершины-синонимы, как мы описывали в предыдущей главе. Поэтому нет необходимости специально рассматривать вершины конструкторов данных. [23]
Преобразования графа показаны на рис. 11.5. Мусор не показан, а корневая вершина очередного редекса помечена символом в каждом графе. Подстановка приводит к графу ( б), где разделение выражения аргумента очевидно. Последние три шага редукции определяются правилами применения примитивных функций и могут быть рассмотрены после прочтения следующего параграфа. Однако преобразования графа являются очень простыми и вполне очевидными: редекс графа ( г) является первым аргументом строгой примитивной функции -) -, а следующие две редукции являются просто применениями примитивной функции () к постоянным аргументам. [24]
Редукция графов происходит с помощью именно этих макросов. Макрос EVAL инициализирует вычисление выражения, которое в ленивой системе является требуемым результатом, если его вычисление не будет специальным образом форсировано. EVAL служит для вычисления выражений верхнего уровня ( см. разд. Выполнение UNWIND и RET всегда отчасти аналогично применению EVAL. Применение примитивных функций происходит по В-схеме ( см. разд. [25]