Россия |
Списки и атомы
Упражнения 3.1.: Нарисуйте диаграммы для списков вида:
((A B) C) ((A B) (D C)) ((A B)(D(C E)))
Любой список может быть построен из пустого списка и атомов с помощью CONS и любая его часть может быть выделена с помощью подходящей композиции CAR-CDR.
CONS - Функция, которая строит списки из бинарных узлов, заполняя их парами объектов, являющихся значениями пары ее аргументов. Первый аргумент произвольного вида размещается в левой части бинарного узла, а второй, являющийся списком, - в правой.
CAR – Функция, обеспечивающая доступ к первому элементу списка - его "голове".
CDR – Функция, укорачивающая список на один элемент. Обеспечивает доступ к "хвосту" списка, т.е. к остатку списка после удаления его головы.
ATOM - Функция, различающая составные и атомарные объекты. На атомах ее значение "истина", а на более сложных структурах данных – "ложь".
EQ – Функция, которая проверяет атомарные объекты на равенство.
Функция | Аргументы | Результат |
---|---|---|
Конструирование структур данных | ||
CONS | A и Nil | (A ) |
CONS | (A B) и Nil | ((A B) ) |
CONS CONS |
A и (B) (Результат предыдущего CONS) и ( C ) |
(A B) ((A B) C) |
CONS | A и (B C) | (A B C) |
Доступ к компонентам структуры данных: | ||
Слева | ||
CAR | (A B C) | A |
CAR | (A (B C)) | A |
CAR | ((A B) C) | (A B) |
CAR | A | Не определен |
Справа | ||
CDR | (A ) | Nil |
CDR | (A B C D) | (B C D) |
CDR | (A (B C)) | ((B C)) |
CDR | ((A B) C) | ( C ) |
CDR | A | Не определен |
Обработка данных: | ||
CDR CAR |
(A B C) Результат предыдущего CDR |
(B C) B |
CAR CAR |
(A C) Результат предыдущего CAR |
A Не определен |
CONS CAR |
A и (B) Результат предыдущего CONS |
(A B) A |
CONS CDR |
A и (B) Результат предыдущего CONS |
(A B) (B) |
Предикаты: | ||
Атомарность – неделимость | ||
ATOM | VeryLongStringOfLetters | T |
ATOM | ( A B ) | Nil - выполняет роль ложного значения |
CDR ATOM |
( A B ) Результат предыдущего CDR |
(B) Nil |
ATOM | Nil | T |
ATOM | ( ) | T |
Равенство | ||
EQ | A A | T |
EQ | A B | Nil |
EQ | A (A B) | Nil |
EQ | (A B) (A B) | Не определен |
EQ | Nil и () | T |
Различие истинностных значений в Лиспе принято отождествлять с разницей между пустым списком и остальными объектами, которым программист может придать в программе некоторый другой смысл. Таким образом, значение "ложь" – это всегда Nil.
Если требуется явно изобразить значение "истина", то используется стандартная константа – атом T (true), но роль значения "истина" может выполнить любой, отличный от пустого списка, объект.
Упражнение 3.2. Посмотрите, что сделает Лисп-система с ниже приведенными выражениями2Латинский шрифт используется исключительно ради простоты набора текстов. Вполне допустима кириллица , сравнивая результаты с данными из таблицы 3.1:
(CONS 'Head Nil ) (CONS 'Head '(Body Tail) ) (CAR '(Head Body Tail)) (CDR '(Head Body Tail)) (ATOM 'Body) (ATOM '(Body)) (ATOM ()) (ATOM (CAR '(Head Body Tail))) (EQ Nil ())
Точечная нотация
При реализации Лиспа в качестве единой универсальной базовой структуры для конструирования символьных выражений использовалась так называемая "точечная нотация" ( dot-nоtation ), согласно которой левая и правая части бинарного узла равноправны и могут хранить данные любой природы.
Бинарный узел, содержащий пару атомов ATOM1 и ATOM2,
можно представить как запись вида:
( ATOM1 . ATOM2 )
Если вместо атомов " ATOM1 ", " ATOM2 " рекурсивно подставлять произвольные атомы, затем построенные из них пары и так далее, то мы получим множество всех возможных составных символьных выражений – S-выражений.
S-выражение - это или атом или заключенная в скобки пара из двух S-выражений, разделенных точкой.
Все сложные данные создаются из одинаково устроенных блоков - бинарных узлов, содержащих пары объектов произвольного вида. Каждый бинарный узел соответствует минимальному блоку памяти.
Списки – это подмножество S-выражений, движение вправо по которым завершается атомом Nil.
(A . B)
(C . (A . B))
Любое S-выражение может быть построено из атомов с помощью CONS и любая его часть может быть выделена с помощью CAR-CDR.
Упражнение 3.3. Нарисуйте диаграммы для следующих S-выражений:
((A . B) . C) ((A . B) . (D . C)) ((A . B) . (D . (C . E)))