Шаг 8.
Базисные функции для работы со списками. Элементарные селекторы

    На этом шаге мы начнем изучать функции, используемые для работы со списками.

    В языке LISP для построения и анализа списков существуют базисные функции. С их помощью описывается система аксиом языка (алгебру обработки списков).

    Базисными функциями являются: CAR, CDR, CONS, ATOM и EQ. Отметим, что предикаты ATOM и EQ мы уже рассмотрели.

Таблица 1. Функции для работы со списками в muLISP81
Функция
Назначение
CAR
Возвращает первый элемент списка (голову списка).
CDR
Возвращает список без первого элемента (хвост списка).
CAAR
Возвращает голову головы списка.
CDAR
Возвращает хвост головы списка.
CADR
Возвращает голову хвоста (второй элемент списка).
CDDR
Возвращает хвост хвоста списка.
CADDR
Возвращает голову хвоста хвоста (третий элемент списка).
CDDDR
Возвращает хвост хвоста хвоста списка.
CAAAR
Возвращает голову головы головы списка.
CDAAR
Возвращает хвост головы головы списка.
CADAR
Возвращает голову хвоста головы списка.
CDDAR
Возвращает хвост хвоста головы списка.
CAADR
Возвращает голову головы хвоста списка.
CDADR
Возвращает хвост головы хвоста списка.

    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.




Предыдущий шаг Содержание Следующий шаг