Здравствуйте! Записался на ваш курс, но не понимаю как произвести оплату. Надо ли писать заявление и, если да, то куда отправлять? как я получу диплом о профессиональной переподготовке? |
Элементарный Лисп
Точечная нотация
Исторически при реализации Лиспа в качестве единой базовой структуры для конструирования S-выражений использовалась так называемая "точечная нотация" (dot-nоtation), согласно которой левая и правая части бинарного узла равноправны и могут хранить данные любой природы.
Бинарный узел, содержащий пару атомов ATOM1 и ATOM2, можно представить в виде S-выражения вида:
( ATOM1 . ATOM2 )
Функциия | Аргументы | Результат |
---|---|---|
Конструирование структур данных | ||
CONS | A и NIL | (A ) |
CONS | (A B) и NIL | ((A B) ) |
CONS | A и (B) | (A B) |
CONS | (Результат предыдущего CONS ) и (C) | ((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 | (A B C) | (B C) |
CAR | результат предыдущего CDR | B |
CAR | (A C) | A |
CAR | результат предыдущего CAR | не определен |
CONS | A и (B) | (A B) |
CAR | результат предыдущего CONS | A |
CONS | A и (B) | (A B) |
CDR | результат предыдущего CONS | (B) |
Предикаты: | ||
Атомарность — неделимость | ||
ATOM | VeryLongStringOfLetters | T |
CDR | (A B) | (B) |
ATOM | результат предыдущего CDR | 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 |
Если вместо атомов ATOM1, ATOM2 рекурсивно подставлять произвольные атомы, затем построенные из них пары и так далее, то получим множество всех возможных S-выражений. Можно сказать, что S-выражение — это или атом или заключенная в скобки пара из двух S-выражений, разделенных точкой. Все сложные данные выстраиваются из одинаково устроенных блоков — бинарных узлов, содержащих пары объектов произвольного вида. Каждый бинарный узел соответствует минимальному блоку памяти.
ATOM (A . B) (C . (A . B)) ((A . B) . C) ((A . B) . (D . C)) ((A . B) . (D . (C . E)))
Любое S-выражение может быть построено из атомов с помощью CONS, и любая его часть может быть выделена с помощью CAR-CDR.
Расширение типа данных, допускаемых в качестве второго аргумента CONS, ни в малейшей степени не усложняет реализацию этой функции, равно как и реализацию функций CAR и CDR, зато их описания становятся проще. Функция CONS строит бинарный узел и заполняет его парой объектов, являющихся значениями пары ее аргументов. Первый аргумент размещается в левой части бинарного узла, а второй — в правой. Функция CAR обеспечивает доступ к объектам, расположенным слева от точки, а функция CDR — справа.
Точечная нотация точнее, чем списки, представляет логику хранения данных в памяти и доступа к компонентам структур данных, но для непосредственного представления и обработки символьных выражений она оказалась менее удобной. Практически сразу была предложена более лаконичная запись наиболее употребимого подкласса S-выражений в виде списков произвольной длины вида (A B C D E F G H ). В виде списков можно представить лишь те S-выражения, в которых при движении вправо в конце концов обнаруживается атом NIL, символизирующий завершение списка.
Атом NIL, рассматриваемый как представление пустого списка (), играет роль ограничителя в любом списке. Одноэлементный список (A) идентичен S-выражению (A . NIL). Список (A1 A2 ... Ak) может быть представлен как S-выражение вида:
(A1 . (A2 . ( ... . (Ak . NIL) ... ))).
В памяти это фактически одна и та же структура данных. (Запятая в качестве разделителя элементов списка в первых реализациях Лиспа поддерживалась, но не прижилась. Пробел оказался удобнее.)
Для многошагового доступа к отдельным элементам такой структуры удобно пользоваться мнемоничными обозначениями композиций из многократных CAR-CDR. Имена таких композиций устроены как цепочки из "a" или "d", задающие маршрут движения из шагов CAR и CDR, соответственно, расположенный между "c" и "r". Указанные таким способом CAR-CDR исполняются с ближайшего к аргументу шага, т.е. в порядке, обратном записи.