Скачиваний:
9
Добавлен:
01.05.2014
Размер:
9.66 Кб
Скачать

Шаг 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 и т.д.

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

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

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

Соседние файлы в папке Язык программирования ЛИСП