Базовые функции обработки S-выражений
Функция | Вызов | Действие | Пример использования |
CAR | (CAR список) | Возвращает головною часть | (CAR(1 234)) |
списка - его 1-й элемент | Результат:1 | ||
CDR | (CDR список) | Возвращает хвостовую часть | (CDR(! 234)) |
списка- все. кроме 1-го элемента | Результат:(2 3 4) | ||
CONS | (CONS S-выра- | Строит список из переданных в | (CONS I (2 3 4)) |
жение список) | качестве аргументов головы и хвоста | Результат: (1234) | |
ATOM | (ATOMS-выра- | Предикат; проверяет, является ли | (ATOM A) : t |
жение) | аргумент атомом, и возвращает либо t | (ATOM (1 2 3)): Nil | |
(истина), либо Nil или ("(ложь) | |||
EQ | (EQ символ | Предикат: проверяет тождественность | (EQ A A): t |
символ) | символов-аргументов, неприменим | (EQ X (CAR (X Y Z))): t | |
для чисел | |||
EQL | (EQL число | Предикат, проверяет тождественность | (EQL 3.0 3.0): t |
число) | чисел одного типа | ||
= | (= число | Предикат, проверяет тождественность | |
число) | чисел различных типов | (=30.3el):t | |
EQUAL | (EQUAL число | Аналогична EQL, | (EQUAL(xyz)(xyz)):t |
или список | но, кроме того, проверяет идентичность | ||
число или список) | Списков | ||
EQUALP | (EQUALP | Проверка наиболее общего равенства | |
объект объект) | |||
NULL | (NULL список) | Проверка, является ли аргумент | |
пустым списком | |||
NOT | (NOT логическая | Логическое отрицание | |
величина) | |||
NTH | (NTH n список) | Выделение n-го элемента списка | (NTH 2 (1 2 3)): 3 |
(индексы начинаются с 0) | |||
FIRST | Предикаты, выделяющие | ||
SECOND | Соответствующие элементы списка | ||
LAST | |||
LIST | (LIST apr | Строит из аргументов список | (LIST a b (с)): (a b c) |
арг2 ...) |
Отметим, что в программах на Лиспе надо тщательно отличать значения от их обозначений.
В Лиспе константы обозначают самих себя. Выражения типа (* 2 2) сразу вычисляются. Чтобы избежать нежелательного вычисления выражения используется функция QUOTE или знак апострофа (') перед выражением:
(* 2 2) : 4
' (* 2 2) :' (* 2 2) – список
Произвольный символ можно использовать как переменную, и он может обозначать произвольное выражение. При первом использовании символу должно быть присвоено или с ним связано некоторое значение с помощью функции SET, например,
(SET 'операции'(+ - */))
Знак ' используется для подавления вычисления аргументов функции SET. Функция SETQ не вычисляет значения 1-го аргумента (а 2-го вычисляет).
На значение символа можно сослаться, указав его без апострофа (').
Для занесения значений в ячейку памяти, связанной с символом, можно пользоваться обобщенной функцией присваивания SETF, размещающей значения в соответствующей ячейке памяти:
(SETF ячейка_памяти значение).
Переменная «ячейка_памяти» без апострофа указывает на ячейку памяти. Присвоение, выполняемое функциям» SET, SETQ и SETF, является побочным эффектом , этих функций, помимо того, данные функции возвращают присваиваемые значения.
ФОРМЫ. УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ В ЛИСП-ПРОГРАММЕ
Программа состоит не только из функций, но и из форм. Простейшими формами являются константы, переменные, лямбда-вызовы, вызовы функций.
Остановимся более подробно на специальных формах, предназначенных для управления обработкой программы и контекстом. У каждой формы определенный синтаксис и семантика, основанные на едином способе записи и интерпретации.
Управляющие предложения Лиспа внешне выглядят как вызовы функций - в виде скобочных выражений, первый элемент которых действует как имя управляющей структуры, а остальные элементы - как аргументы. Наиболее важные формы можно разделить на следующие группы:
Работа с контекстом
• QUOTE или блокировка вычисления,
• вызов функции и лямбда-вызов,
• предложения LET и LET*;
Последовательное исполнение
• предложения PROG1, PROG2 и PROGN;
Разветвление исполнения
• условные предложения COND, IF, WHEN, UNLESS,
• выбирающее предложение CASE;
Итерации
• циклические предложения DO, DO*, LOOP, DOTIMES, DOUNTIL;
Передачи управления
• предложения PROG, GO и RETURN;