2.12.5. Создание новых конструкций в языке Лисп
В языке Лисп имеется возможность создавать новые функции. Для этого используется функция
где атом представляет собой имя функции, которую хотят создать,
— формальные параметры или связанные переменные, а (
-выражение) представляет собой тело функции.
В качестве первых простых примеров построим две уже известные функции, как если бы их в системе не было.
Также просто задается функция REVERSE, которая изменяет на обратный порядок следования “братьев” первого уровня:
• Теперь построим функцию
— функцию объединения двух множеств, представленных списками, состоящими
только из атомов:
(см. скан)
Построим функцию двух аргументов
(см. скан)
Например:
• Теперь построим функцию
для определения списка элементов последовательности
которая задана следующим образом:
(см. скан)
• Опишем функцию
или “сопоставление с образцом”, которая сравнивает две цепочки символов
(по форме) и Е (по содержанию). Эта функция является частным случаем алгоритма унификации, рассмотренного в гл. 3.
Символы из
и Е сопоставляются по одному слева направо. Если они идентичны, процесс продолжается. Однако некоторые символы из
могут быть специальными символами, например
и желательно, чтобы, например, с символом
из
были бы сопоставимы любые символы Е. Тогда функция
будет давать например,
(А С)
Символом из
например, должно сопоставляться некоторое число символов из Е, иапример:
Тогда функция
определяется следующим образом:
В последней функции
части, относящиеся к результату, пусты. В этом случае, как известно, результатом является часть самого теста. В одном случае символ обработан аналогично символу а в другом осуществляется переход в
к следующему символу, не сдвигаясь в
и затем вновь происходит обращение к функции
Это означает, что как бы “абсорбировала” данный символ. Рассмотрим пример работы
функции FILTRE:
Форма
позволяет воздействовать на значения идентификаторов, которые затем используются в качестве аргументов выражений. Функция
помогает отказаться от многократных расчетов одних и тех же величин. Она задается следующим образом:
(см. скан)
Ниже дан пример использования
Функции FEXPR и MACRO
Функция FEXPR не вычисляет значений своих аргументов. Ее синтаксис задается следующим образом:
Ниже дается пример использования этой функции:
К функциям типа FEXPR относятся функции QUOTE, SETQ, COND.
Функция типа
сначала производит интерпретацию тела функции, после чего вычисляется ее значение. Эта функция используется следующим образом:
В качестве примера рассмотрим построение классической процедуры
При этом в качестве параметра будет список: