На этом шаге мы продолжим рассмотрение селекторов, в частности, приведем перечень
селекторов, имеющихся в muLISP85.
В диалектах muLISP85 и muLISP87 определено еще около десяти функций-селекторов: LAST, NTHCDR, NTH, SUBLIST, COUNT, COUNT-IF, FIND, POSITION. Интересно отметить, что и функции ASSOC, RASSOC также относятся к селекторам! Расскажем о функциях-селекторах в muLISP85.
Возвращает последнюю на верхнем уровне точечную пару списка LIST. | |
Возвращает N-й CDR списка LIST. | |
Возвращает N-й элемент списка LIST. | |
Возвращает количество элементов в списке LIST, для которых признак при сравнении с объектом OBJECT по тесту TEST не равен NIL. | |
Копирует и выдает с N-го по M-й элементы списка LIST, где CAR-элемент LIST есть нулевой элемент. | |
Комбинации 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 и т.д.
В начало таблицы
На следующем шаге мы изучим элементарные конструкторы.