Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба_лисп.rtf
Скачиваний:
19
Добавлен:
21.07.2019
Размер:
3.69 Mб
Скачать

Основные функции обработки списков

К операциям выделения отдельных частей списков и создания из них новых структур сводятся многие алгоритмы обработки символьной ин­формации. Основными функциями, на основе которых выполняются ука­занные действия, являются встроенные функции CAR, CDR и CONS. Эти функции определяются на основе функций CAR, CDR, CONS. Список - частный случай точечной пары, то применимы функции, аргументы которых заданы точечными парами.

Для доступа к первому элементу точечной пары или списка приме­няется функция CAR. К примеру:

(саr '(а . b)) ─>А

(саr '(а b)) ─> А

Здесь апостроф, обозначает вызов специальной формы QUOTE , ко­торая блокирует вычисление значения s ─ выражения (а . b) или (а b). Если этого не сделать, то Лисп-интерпретатор (EVAL) предпримет попытку вы­числить эти s-выражения. В соответствии с правилами работы интерпрета­тора, первый элемент s-выражения воспринимается как имя функции. Од­нако, на самом деле, функции с именем А нет. Поэтому возникает ошибка: UNDEFINED-FUNCTION (неопределенная функция). Применение функции QUOTE сообщает Лисп ─ системе, что аргументы функции CAR не подлежат вычислению и представляют самих себя.

Для выделения второго элемента точечной пары применяется функ­ция CDR. К примеру:

  1. >(cdr'(a.b))

В

  1. >(cdr'(a b))

(В)

В первом случае возвращается атом В, а во втором случае - список, содержащий атом В. Этот результат объясняется тем, что список (А В) в точечной записи имеет вид (А . (В . NIL)). Функция CDR возвращает второй элемент точечной пары ( В . NIL), т.е. (В).

Функция CAR и CDR определены только для точечных пар. Для ар­гументов атомов результаты функций CAR и CDR неопределенны.При попытке вызова (саг 'а) формируется сообщение об ошибке. Для выделения произвольных элементов списка используются ком­позиции функций CAR и CDR. К примеру:

  1. > (саг (саг '((а b) (b с))))

А

  1. > (car (cdr (cdr '(1 2 3))))

3

Композиции функций CAR и CDR встречаются довольно часто, по­этому для них введены специальные имена:

(car (car х)) < ─ >(сааr х),

(car (cdr х)) < ─ > (cadr x),

(cdr (car x)) < ─> (cdar x),

(cdr (cdr х)) < ─ > (cddrx),

(cdr (cdr (cdr (cdr x)))) < ─ > (cddddr x).

В Коммон Лиспе для выделения отдельных элементов списков мож­но использовать более удобные имена функций, отражающие суть выпол­няемой операции. Например:

REST ─ эквивалентна CDR, возвращает хвост вписка;

FIRST ─ эквивалента CAR, возвращает первый элемент вписка;

SECOND ─ эквивалентна CADR, возвращает второй элемент списка;

THIRD ─ эквивалентна CADDR, возвращает третий элемент списка и т.д.;

TENTH ─ возвращает десятый элемент списка. Имена указанных функций соответствуют порядковым числительным английского языка.

Для создания точечной пары из s ─ выражений в Лиспе применяется функция CONS (конструктор):

(cons 'а 'b) ─ > (А . В)

Конструирование списков с помощью функции CONS осуществляет­ся последовательными вызовами:

(cons ('х (cons 'у (cons 'z NIL)))) ─ > (X Y Z)

Здесь сначала строится точечная пара (Z . NIL), затем точечная пара -(Y . (Z . NIL)), а в конце - точечная пара (X .(Y . (Z . NIL))), которая и пред­ставляет список (X Y Z). Таким образом, функция CONS включает очеред­ной элемент в начало списка, представленного ее вторым аргументом. В Лиспе имеется функция LIST с произвольным числом аргументов, которая упро­щает задачу создания списков:

(list 1 'b 'с) ─ > (1 В С)

Списки можно также создавать из других списков путем их объеди­нения. Для этого применяется функция APPEND. К примеру,

(append '(1 2 а) '(b 4 5)) ─ > (1 2 А В 4 5)

В Лиспе имеется ряд других полезных функций для обработки списков:

  • LAST ─ выделяет последний элемент списка (результат - список);

  • NTH ─ выделяет n-й элемент списка;

  • SUBST ─выполняет замену элементов в списке;

  • BUTLAST ─ выделяет список без последних элементов;

  • MEMBER ─ проверяет принадлежность элемента списку;

  • LENGTH ─вычисляет длину списка;

  • REVERSE ─ выполняет обращение списка;

  • ADJOIN ─добавляет элемент в множество, представленное списком;

  • REMOVE ─ удаляет элемент из списка.