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

    На этом шаге мы продолжим рассмотрение селекторов, в частности, приведем перечень селекторов, имеющихся в muLISP85.

    В диалектах muLISP85 и muLISP87 определено еще около десяти функций-селекторов: LAST, NTHCDR, NTH, SUBLIST, COUNT, COUNT-IF, FIND, POSITION. Интересно отметить, что и функции ASSOC, RASSOC также относятся к селекторам! Расскажем о функциях-селекторах в muLISP85.

Таблица 1. Функции для работы со списками в muLISP85
Функция
Назначение
(LAST LIST)
Возвращает последнюю на верхнем уровне точечную пару списка LIST.
(NTHCDR N LIST)
Возвращает N-й CDR списка LIST.
(NTH N LIST)
Возвращает N-й элемент списка LIST.
(COUNT OBJECT LIST TEST)
Возвращает количество элементов в списке LIST, для которых признак при сравнении с объектом OBJECT по тесту TEST не равен NIL.
(SUBLIST LIST N M)
Копирует и выдает с N-го по M-й элементы списка LIST, где CAR-элемент LIST есть нулевой элемент.
CAAR, ..., CDDR, ..., CAAAR, ..., CAAAAR, ..., CDDDDR
Комбинации CAR и CDR.

    1. Функция (LAST LIST) возвращает последнюю на верхнем уровне точечную пару списка LIST. Отметим, что функция LAST возвращает последнюю точечную пару, а не последний элемент LIST. Если список LIST является атомом, то функция LAST возвращает NIL. Например:


   $ (LAST '(A B C D))      $ (LAST 'FCO)
   (D)                      NIL
   $ (LAST '(A B C . D))    $ (LAST '((2 1) (1 2) (3 4)))
   (C . D)                  ((3 4))
Последний элемент списка можно определить путем применения функции CAR к аргументу (LAST LIST). Например:

   $ (CAR (LAST '(A B C)))
   C
Приведем код функции:

   (DEFUN LAST (LST)
      ( (ATOM LST) NIL )
      ( (ATOM (CDR LST)) LST )
      ( LAST (CDR LST) )
   )
В начало таблицы

    2. Если N - нуль или положительное целое, то функция (NTHCDR N LIST) возвращает N-й CDR списка LIST. Функция NTHCDR возвращает NIL, если N не является ни 0, ни положительным целым, или если список LIST имеет N или менее элементов. Например:


   $ (NTHCDR 0 '(A B C D))      $ (NTHCDR 5 '(A B C D))
   (A B C D)                    NIL
   $ (NTHCDR 1 '(A B C D))      $ (NTHCDR 2 '(A B . C))
   (B C D)                      C
   $ (NTHCDR 2 '(A B C D))
   (C D)
Приведем код функции:

   (DEFUN NTHCDR (N LST)
      ( (ZEROP N) LST )
      ( (AND (INTEGERP N) (PLUSP N))
           ( (ATOM LST) NIL )
           ( NTHCDR (SUB1 N) (CDR LST)) )
   )
В начало таблицы

    3. Если N - нуль или положительное целое число, то функция (NTH N LIST) возвращает N-й элемент списка LIST, где CAR списка LIST считается нулевым элементом. Функция NTH возвращает NIL, если N - ни ноль, ни положительное целое, либо если LIST имеет N или меньше элементов. Например:


   $ (NTH 0 '(A B C D))    $ (NTH 4 '(A B C D))
   A                       NIL
   $ (NTH 3 '(A B C D))    $ (NTH 2 '(A B . C))
   D                       NIL
Приведем код функции:

   (DEFUN NTH (N LST)
      ( (ATOM (NTHCDR N LST)) NIL )
      ( CAR (NTHCDR N LST) )
   )
В начало таблицы

    4. Функция (COUNT OBJECT LIST TEST) возвращает количество элементов в списке LIST, для которых признак при сравнении с объектом OBJECT по тесту TEST не равен NIL. Если тест-аргумент не задан или равен NIL, функция COUNT использует EQL-тест.

    Функция (COUNT-IF TEST LIST) возвращает количество элементов в списке LIST, для которых признак проверки по тесту TEST - не NIL. Например:


   $ (COUNT 'DOG '(CAT DOG COW PIG DOG ANT))
   2
   $ (COUNT-IF 'EVENP '(3 -6 8 7 0))
   3
   $ (COUNT 'a '(NIL a (2 a) a a (3 4)))
   3
   $ (COUNT-IF 'NUMBERP '(NIL 3 (2 a) a -14 (3 4)))
   2
В начало таблицы

    5. Если N и M - неотрицательные целые, и N<=M, то функция (SUBLIST LIST N M) копирует и выдает с N-го по M-й элементы списка LIST, где CAR-элемент LIST есть нулевой элемент.

    Если M - не целое число или больше или равно длины списка LIST, M принимается как величина на единицу меньшая длины LIST. Если N - не целое число, отрицательное число или N>M, то функция SUBLIST возвращает NIL. Например:


   $ (SUBLIST '(A B C D E F) 2 4)
   (C D E)
   $ (SUBLIST '(A B C D E F) 2 2)
   (C)
   $ (SUBLIST '(A B C D E F) 0 3)
   (A B C D)
   $ (SUBLIST '(A B C D E F) 2)
   (C D E F)
Приведем код функции:

   (DEFUN SUBLIST (LST N M)
      ( (INTEGERP N)
         ( (INTEGERP M)
             (FIRST (ADD1 (-M N)) (NTHCDR N LST)) )
         (NTHCDR N LST) )
   )
В начало таблицы

    6. Разрешается использовать функции, являющиеся комбинациями CAR и CDR. Имя каждой из этих функций начинается с "С" и заканчивается на "R". Между ними располагается последовательность из букв "А" и "D", указывающих, как комбинируются CAR и CDR при выполнении функции. В muLISP допустимы следующие комбинации:


   CAAR, ..., CDDR, ..., CAAAR, ..., CAAAAR, ..., CDDDDR.
Рассмотрим типичные определения для составных функций отбора:

   (DEFUN CAAR (OBJ)
      (CAR (CAR OBJ))
   )
   (DEFUN CADDR (OBJ)
      (CAR (CDR (CDR OBJ)))
   )
   (DEFUN CDADAR (OBJ)
      (CDR (CAR (CDR (CAR OBJ))))
   )
Следующие селекторы широко используются для извлечения элементов списка:

   $ (CAR '(A B C D E))     $ (CADDR '(A B C D E))
   A                        C
   $ (CDR '(A B C D E))     $ (CADDDR '(A B C D E))
   (B C D E)                D
   $ (CADR '(A B C D E))
   B

    Заметим, что данным селекторам могут быть присвоены (по желанию) другие мнемонические имена. Для этого можно использовать функцию MOVD, которая заменит определение CAR на FIRST, CDR на REST, CADR на SECOND и т.д.

В начало таблицы

    На следующем шаге мы изучим элементарные конструкторы.




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