Россия |
Списки и атомы
Расширение типа данных, допускаемых в качестве второго аргумента " 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.