Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Лисп Мурашко ИА, Марина ИМ, БГУИР 2002 (Мет пособие).doc
Скачиваний:
55
Добавлен:
15.06.2014
Размер:
289.28 Кб
Скачать

2. Функции Лиспа

2.1 Функции отбора

1). Функция CAR [ object ] возвращает car-элемент <объекта> (т.е. объект данных, на который указывает car-элемент <объекта>). Корректная интерпретация car-элемента объекта зависит от того, является ли объект атомом, а если нет, рассматривается ли он как список или бинарное дерево. Если объект - атом, то его car-элемент есть текущее значение атома. Если объект - список, его car-элемент есть первый элемент списка. Если объект - бинарное дерево, его car-элемент есть левая ветвь дерева, или car-ветвь.

(CAR '(A B C D E)) --> A

(CAR '((A.B) . C)) --> (A.B)

(SETQ NUM 7) --> 7

(CAR 'NUM) --> 7

2) Функция CDR [object] возвращает cdr-элемент <объекта> (т.е. объект данных, на который указывает cdr-элемент <объекта>). Корректная интерпретация cdr-элемента объекта зависит от того, является ли объект атомом, списком или бинарным деревом. Если объект - символ, его cdr-элемент есть список свойств символа. Если объект - число, его cdr-элемент указывает признак и тип числа . Если объект - список, его cdr-элемент есть остаток списка (т.е. все, кроме последнего, элементы списка). Если объект - бинарное дерево, его cdr-элемент есть правая ветвь дерева, или cdr-ветвь.

(CDR '(A B C)) -->(B C)

(CDR '((A.B) . C)) --> C

3) Функция LAST [list] возвращает последний на верхнем уровне cons <списка>. Отметим, что LAST возвращает последний cons, но не последний элемент <списка>. Если <список> есть атом, LAST возвращает признак NIL. Как показано на примере, последний элемент может извлекаться путем использования функции CAR от (LAST list)

(LAST '(A B C D)) --> (D)

(LAST '(A B C . D)) --> (C . D)

(LAST 'F) --> NIL

(CAR (LAST '(A B C))) --> C

4) Функция NTHCDR [n,list] ) возвращает ncdr элемент <списка>. Если <список> имеет n или меньше элементов или n0, то возвращается NIL.

(NTHCDR 0 '(A B C D)) --> (A B C D)

(NTHCDR 1 '(A B C D)) --> (B C D)

(NTHCDR 2 '(A B C D)) --> (C D)

(NTHCDR 5 '(A B C D)) --> NIL

(NTHCDR 2 '(A B . C)) --> C

5) Функция NTH [n,list] возвращает n-й элемент <списка>. Если <список> имеет n или меньше элементов или n0, то возвращается NIL.

(NTH 0 '(A B C D)) --> A

(NTH 3 '(A B C D)) --> D

(NTH 4 '(A B C D)) --> NIL

(NTH 2 '(A B . C)) --> NIL

2.2. Функции конструктора.

1) Функция CONS [object1, object2] возвращает cons, у которого car-элемент указывает на <обьект1>, а cdr-элемент - на <обьект2>. Если значение *FREE-LIST* есть cons, CONS модифицирует и возвращает этот cons и приводит *FREE-LIST* к cdr *FREE-LIST*. Корректная интерпретация (СONS обьект1 обьект2) зависит от того, как рассматривается <обьект2>. Если <обьект2> - список, CONS создает список, первым элементом которого является <обьект1>, а остатком - <обьект2>. Если <обьект2> - атом или бинарное дерево, CONS создает дерево, у которого левая ветвь, или car-ветвь есть <обьект1>, а правая ветвь, или cdr-ветвь - <обьект2>.

(CONS 'A '(B C D)) --> (A B C D)

(CONS 'A 'B) --> (A . B)

2) Функция ACONS[key,object,alist] создает пару (ключ.объект), располагает ее в начале ассоциативного списка и возвращает результирующий ассоциативный список. ACON упрощает процесс создания ассоциативных списков.

(ALIST 'EYES 'BLUE '((WEIGTH . 170) (HEIGTH . 72))) --> ((EYES . BLUE) (WEIGTH . 170) (HEIGTH . 72))

3) Функция LIST [object1,object2,..,objectn] создает и выдает список, состоящий из элементов с <обьекта1> по <объектn>. Если функция вызвана без аргументов, то LIST возвращает признак NIL. LIST может работать с любым количеством аргументов.

(LIST 'A 'B 'C 'D) ---> (A B C D)

(LIST 'A '(B C) 'D) ---> (A (B C) D)

(LIST) ---> NIL

4) Функция APPEND [list1,list2,...,listn] создает и возвращает список, состоящий из элементов списков, начиная со <списка1> и по <списокn>. APPEND копирует cons-ы высшего уровня каждого из своих аргументов, кроме последнего. Если функция вызывается с единственным аргументом, APPEND просто возвращает этот аргумент без его копирования. Следовательно, для копирования списка лучше использовать COPY-LIST, чем APPEND. Отметим, что APPEND использует cons-ы для копирования всех, кроме последнего, аргументов.

(SETQ FOO '(D E F)) --> (D E F)

(APPEND '(A B C) FOO '(G H I)) --> (A B C D E F G H I)

FOO --> (D E F)

(APPRND '(A B C D) 'E 'F 'G) --> (A B C D . G)

5) Функция FIRSTN [n,list]. Если <n> - положительное целое, (FIRST n список) копирует и возвращает первые n элементов списка. FIRSTN возвращает NIL, если n -неположительное целое. Если <список> имеет n или более элементов, FIRSTN копирует и возвращает элементы <списка>.

(FIRSTN 0 '(SUE JOE ANN BOB)) --> NIL

(FIRSTN 2 '(SUE JOE ANN BOB)) --> (SUE JOE)

(FIRSTN 4 '(SUE JOE ANN BOB)) --> (SUE JOE ANN BOB)

(FIRSTN 5 '(SUE JOE ANN BOB)) --> (SUE JOE ANN BOB)

(FIRSTN 2 '(A B . C) -> (A B)

(FIRSTN 3 '(A B . C --> (A B)

6) Функция REVERSE [list,object] создает и выдает список, состоящий из элементов <списка>, но в обратном порядке. (REVERSE список объект) выдает элементы <списка> в обратном порядке, присоединенные к <объекту>. Результат является таким же, как и при работе функции (APPEND (REVERSE list) object), но вызов REVERSE в качестве второго аргумента более эффективен

(REVERSE '(A B C D E)) --> (F D C B A)

(REVERSE '(A B C) '(D E F)) --> (C B A D E F)

(REVERSE '(A B C) 'D) --> (C B A . D)

7) Функция LENGTH [object] возвращает длину <объекта>, соответствующую его типу данных. Если <объект> есть NIL или cons, то LENGTH выдает количество cons-ов высокого уровня (т.е. элементов) в объекте. Если <объект> - символ, то LENGTH выдает количество букв в Р-имени <объекта>. Если <объект> - число, LENGTH выдает количество слов (слово равно 2-м байтам), требуемых для размещения числового вектора <объекта>.

(LENGTH '(A B C D)) --> 4

(LENGTH NIL) --> 0

(LENGTH 'MULISP) --> 6

(LENGTH -13) --> 1