На этом шаге мы начнем изучать функции, используемые для работы со списками.
В языке LISP для построения и анализа списков существуют базисные функции. С их помощью описывается система аксиом языка (алгебру обработки списков).
Базисными функциями являются: CAR, CDR, CONS, ATOM и EQ. Отметим, что предикаты ATOM и EQ мы уже рассмотрели.
Возвращает первый элемент списка (голову списка). | |
Возвращает список без первого элемента (хвост списка). | |
Возвращает голову головы списка. | |
Возвращает хвост головы списка. | |
Возвращает голову хвоста (второй элемент списка). | |
Возвращает хвост хвоста списка. | |
Возвращает голову хвоста хвоста (третий элемент списка). | |
Возвращает хвост хвоста хвоста списка. | |
Возвращает голову головы головы списка. | |
Возвращает хвост головы головы списка. | |
Возвращает голову хвоста головы списка. | |
Возвращает хвост хвоста головы списка. | |
Возвращает голову головы хвоста списка. | |
Возвращает хвост головы хвоста списка. |
1. Функция CAR (произносится "кар") возвращает в качестве значения первый элемент
списка (голову списка). Например:
$ (CAR (A B C D E))
A
$ (CAR (A.B) . C))
(A.B)
Если в качестве аргумента функции CAR выступает литеральный атом, то результат
выполнения функции зависит от конкретного диалекта. В muLISP применение CAR к
атому разрешено, в других диалектах (например, Common LISP, Standard LISP)
это вызовет сообщение об ошибке.
В начало таблицы
2. Функция CDR (если в имени нет гласных звуков, как в CDR, то мы делаем
все от нас зависящее, чтобы облегчить произношение, слово CDR можно произносить
примерно так: "каддэр" (сudder) или "куд-эр"), примененная к списку,
возвращает список, полученный из исходного отбрасыванием первого элемента
(хвост списка), например:
$ (CDR (A B C D E))
(B C D E)
$ (CDR ((A.B) . C))
C
Хвостом списка, состоящего из одного элемента, является пустой список (NIL).
Заметим, что в muLISP85 CDR-элементом числа является признак и тип числа.
Функция CDR от атома возвращает список свойств этого атома.
Необычные имена функций CAR и CDR возникли по историческим причинам. Эти имена являются сокращениями от наименований регистров Contents of Address portion of Register (CAR) и Contents of Decrement portion of Register (CDR) вычислительной машины IBM 704. Автор языка LISP Джон Маккарти (США) реализовал первую LISP-систему именно на этой машине и использовал регистры CAR и CDR для хранения указателей на голову и хвост списка.
Заметим, что, комбинируя селекторы CAR и CDR, можно выделять элементы списка.
Например:
$ (CDR (CDR (CAR ((A B C) (D E) (F)))))
(C)
Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения, и в muLISP используется для этого более короткая запись: желаемую комбинацию вызовов CAR и CDR можно записать в виде одного вызова функции: (C...R Список).
Вместо многоточия записывается нужная комбинация из букв A (для функции CAR)
и D (для функции CDR), например:
вместо (CADR X) записывается (CAR (CDR X)).
В начало таблицы
3. CAAR - голова головы списка.
4. CDAR - хвост головы списка.
5. CADR - голова хвоста (второй элемент списка).
6. CDDR - хвост хвоста списка.
7. CADDR - голова хвоста хвоста (третий элемент списка).
8. CDDDR - хвост хвоста хвоста списка.
9. CAAAR - голова головы головы списка.
10. CDAAR - хвост головы головы списка.
11. CADAR - голова хвоста головы списка.
12. CDDAR - хвост хвоста головы списка.
13. CAADR - голова головы хвоста списка.
14. CDADR - хвост головы хвоста списка.
Отметим, что в диалекте muLISP81 записать в сокращенном
виде выражение для четвертого элемента списка уже не
удастся: приходится писать (CAR (CDDDR LST)).
На следующем шаге мы продолжим рассмотрение селекторов, в частности, приведем перечень селекторов, имеющихся в muLISP85.