Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лахов.doc
Скачиваний:
1
Добавлен:
15.04.2019
Размер:
380.42 Кб
Скачать

Функции для обработки списков

ЛИСП – главным образом язык списков, а CAR, CDR и CONS являются тремя примитивными функциями отработки списков, из которых получаются все другие функции обработки списков. Все имена функций ЛИСПа произносятся, как если бы это были английские слова. Так CAR – кар, CDR – ка-де-эр.

Функция CAR в качестве аргумента получает список. Её значением является первый элемент этого списка так,

если Х есть (2 6 4 7), то (CAR Х) есть 2;

если Х есть (2 (6 (4 (7)))), то (CAR Х) есть 2;

если Х есть ((2 6) (4 7)), то (CAR Х) есть (2 6);

если Х есть ((((2) 6) 4) 7), то (CAR Х) есть (((2) 6) 4).;

Функция CDR в качестве аргумента также получает список. Её значением является остаток списка после удаления первого элемента. Так,

если Х есть (2 6 4 7), то (CDR Х) есть (6 4 7);

если Х есть (2 (6 (4 (7)))), то (CDR Х) есть ((6 (4 (7)));

если Х есть ((2 6) (4 7)), то (CDR Х) есть ((4 7)),

если Х есть ((((2) 6) 4) 7), то (CDR Х) есть(7).;

Если Х является атомом, то выражение (CAR Х) не имеет смысла и в действительности не определено (и будет причиной ошибки). Если Х – список, содержащий в точности один элемент, то (CDR Х) не имеет смысла по данному выше определению. Однако мы заключим соглашение, что в этом случае (CDR Х) равно специальному атому NIL, который, также используется для обозначения «лжи» (“false”).

Функция CONS собирает вновь то, что CAR и CDR разбили на части. Её значением является список, а её аргументом ( их два) служат результаты CAR и CDR, примененный соответственно к этому списку так,

если Х есть 2 и Y есть (6 4 7) то (CONS X Y) есть (2 6 4 7);

если Х есть 2 и Y есть ((6 (4 (7)))), то (CONS X Y) есть (2 (6 (4 (7))));

если Х есть (2 6) и Y есть (( 4 7)) то (CONS XY) есть ((2 6) (4 7));

если Х есть (((2) 6) 4) и Y есть (7) то (CONS XY) есть ((((2) 6) 4) 7);

Результатом функции CONS, применённой к любым двум аргументам. является следующее. Второй аргумент CONS должен быть списком. Чтобы получить значение CONS присоединим к началу этого списка ещё один элемент, а именно первый аргумент CONS (который может быть чем угодно, включая атом).

Второй элемент любого списка есть первый элемент (CAR L), или, что то же самое, (CDR (CAR L)). Это также может быть записано как (CADR L). Третий элемент списка L является вторым элементом (CDR L), что равно (CADR (CDR L)), или (CAR (CDR (CDR L)). Это также может быть записано как (CADDR L).

В общем случае большинство ЛИСП – систем позволяет пользователю порождать специальные имена функций, записывая букву С, следующие за ней буквы А и D, количество которых не превышает разумных пределов (скажем, 5), и следующую за ними букву R. Каждая буква А в таких выражениях означает CAR, и каждая D означает CDR, а буквы А и D берутся по порядку слева направо. Так,

(CDADDR Y) означало бы (CDR (CAD (CDR (CDR Y)))).

Функция АPPEND соединяет вместе два списка. Так,

если X есть (1 2 3) и Y есть (4 5 6),то (APPEND X Y) есть (1 2 3 4 5 6).

Это иногда называется конкатенацией списков (1 2 3) и (4 5 6). Заметим, что в этом случае (CONS X Y) было бы ((1 2 3 ) 4 5 6).