Списки и атомы
Расширение типа данных, допускаемых в качестве второго аргумента " CONS ", ни в малейшей степени не усложняет реализацию этой функции, равно как и реализацию функций " CAR " и " CDR ", зато их описания становятся проще:
CONS - Функция, которая строит бинарный узел и заполняет его парой объектов, являющихся значениями пары ее аргументов. Первый аргумент размещается в левой части бинарного узла, а второй - в правой.
CAR – Функция, обеспечивающая доступ к объектам, расположенным слева от точки в точечной нотации, т.е. в левой части бинарного узла.
CDR - Функция, обеспечивающая доступ к объектам, расположенным справа от точки в точечной нотации, т.е. в правой части бинарного узла.
| Функция | Аргументы | Результат |
|---|---|---|
| Конструирование структур данных | ||
| CONS | A и B | (A . B) |
| CONS | (A . B) и C | ((A . B) . C) |
|
CONS CONS |
A B (Результат предыдущего CONS) и C |
(A . B) ((A . B) . C) |
| Доступ к компонентам структуры данных: | ||
| Слева | ||
| CAR | (A . B) | A |
| CAR | ((A . B) . C) | (A . B) |
| Справа | ||
| CDR | (A . B) | B |
| CDR | (A . (B . C)) | (B . C) |
| Обработка данных: | ||
|
CDR CAR |
(A . (B . C)) Результат предыдущего CDR |
(B . C) B |
|
CDR CAR |
(A . C) Результат предыдущего CDR |
C Не определен |
|
CONS CAR |
A и B Результат предыдущего CONS |
(A . B) A |
|
CONS CDR |
A и B Результат предыдущего CONS |
(A . B) B |
| Тождества:(на произвольных объектах) | ||
|
CONS CAR |
Два произвольных объекта x и y. Результат предыдущего CONS |
Исходный объект x (первый аргумент CONS ) |
|
CONS CDR |
Два произвольных объекта x и y. Результат предыдущего CONS. |
Исходный объект y (второй аргумент CONS ) |
|
CAR CDR CONS |
Произвольный составной объект x - не атом. Тот же самый объект x. Результаты предыдущих CAR и CDR |
Исходный объект x |
| Предикаты: | ||
| Атомарность – неделимость | ||
| ATOM | ( A . B ) | Nil - выполняет роль ложного значения |
|
CDR ATOM |
( A . B ) Результат предыдущего CDR |
B T |
| Равенство | ||
| EQ | (A . B) (A . B) | Не определен |
Точечная нотация может точно представлять логику хранения любых структур данных в памяти и доступа к компонентам структур данных. В виде списков можно представить лишь те S-выражения, в которых при движении вправо в конце концов обнаруживается атом Nil, символизирующий завершение списка.
Упражнение 3.4. Посмотрите, что делает Лисп-система с ниже приведенными выражениями, сравнивая результаты с данными из таблицы 3.2:
(CONS 'Head 'Tail ) (CAR '(Head . Tail)) (CDR '(Head . Tail)) (ATOM 'Atom) (ATOM ()) (ATOM (CAR '(Head . Tail))) (EQ Nil ())
Атом Nil, рассматриваемый как представление пустого списка (), выполняет роль ограничителя в списках. Одноэлементный список (A) идентичен S-выражению (A . Nil). Список (A1 A2 … Ak) может быть представлен как S-выражение вида:
(A1 . (A2 . ( … . (Ak . Nil) … ))).
В памяти это фактически одна и та же структура данных.
Для многошагового доступа к отдельным элементам такой структуры удобно пользоваться мнемоническими обозначениями композиций из многократных CAR-CDR. Имена таких композиций устроены как цепочки из " a " или " d ", задающие маршрут движения из шагов CAR и CDR соответственно, расположенный между " c " и " r ". Указанные таким способом CAR-CDR исполняются с ближайшего к аргументу шага, т.е. в порядке, обратном записи.
| Композиции CAR-CDR | Вычисляются в порядке, обратном записи: | |
|---|---|---|
| CAAR | ((A ) B C) | A |
| CADR | (A B C) | B - CDR, затем CAR |
| CADDR | (A B C) | C - (дважды CDR), затем CAR |
| CADADR | (A (B C) D) | C - два раза:(CDR, затем CAR) |
Упражнение 3.5. Посмотрите, что делает Лисп-система с ниже приведенными выражениями, сравнивая результаты с данными из таблицы 3.3:
(cAAr '((A) B C) ) (cADr '(A B C)) (cADDr '(A B C) ) (cADADr '(A (B C) D))
Выводы:
- Список – это перечень произвольного числа элементов, разделенных пробелами, заключенный в круглые скобки.
- Элементы списка могут быть любой природы.
- S-выражение - это или атом или заключенная в скобки пара из двух S-выражений, разделенных точкой. Список – частный случай S-выражения.
- Любое S-выражение может быть построено из атомов с помощью CONS и любая его часть может быть выделена с помощью CAR-CDR.
- Для изображения S-выражений используют различные нотации: графическую, точечную и списочную.
- Базис Лиспа содержит элементарные функции CAR, CDR, CONS, EQ, ATOM.