Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

2.2.5 Функции setq и quote

Будучи языком функций, ЛИСП, кроме того, является символьным языком. Одна из важных особенностей ЛИСПа состоит в том, что данные, которыми он манипулирует, необязательно состоят из чисел.

Пример: (SETQ X Y).

Здесь присваивается Х значение У. Если У здесь есть некоторый символ, то Х также будет символом. Для того, чтобы в самый первый раз присвоить символам значения используется функция QUOTE:

(SETQ X (QUOTE Y)).

QUOTE - функция, значением которой является сам аргумент.

Пример: (+2 3)  5

(QUOTE (+2 3)) (+2 3)

(SETQ (QUOTE X) Y) = (SETQ X Y).

Если мы напишем (SETQ P Q), то устанавливаем Р значение Q, которое, как правило, не является самим символом Q.

Есть специальные атомы , которые имеют фиксированное значение: T - имеет значение T (истина);

NIL - имеет значение NIL (ложь).

(SETQ X Y) связывает идентификатор с его значением. Здесь X-переменная.

(SETQ X 10)-> X ;вернет имя переменной.

Функция QUOTE (альтернативное обозначение этой функции ') сообщает, что идентификатор изображает сам себя, т.е. не вычисляется.

Например,

'Y -> Y

(SETQ X '(X Y Z))->X

Т.е. QUOTE блокирует вычисление "s-выражения", которое идет следом.

Пример

(SETQ X (1 2 9 7 THETA 2 9))

В этом случае при попытке присвоить переменной Х значение

списка будет ошибка, т.к. первый элемент списка не является

функцией. Должна быть запись:

(SETQ X (QUOTE (1 2 9 7 THETA 2 9))).

2.2.6 Функции car и cdr

Функции CAR и СDR позволяют разобрать список на составные части. Общий формат функции CAR:

(CAR <точечная пара>) - возвращает первый элемент из точечной пары.

(CAR <список>) - возвращает первый элемент списка.

(CAR <атом>) - значение функции неопределено.

Пример:

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

(CAR '(AA.(BB.(CC.NIL))))->AA

(CAR '(AA BB CC))->AA

(CAR 'ALPHA)-> неопределено.

Общий формат функции CDR:

(CDR <точечная пара>) или (CDR <список>)

Функция возвращает то, что остается после отбрасывания 1-го элемента. Если аргумент список, то возвращается хвост списка; если точечная пара, то второй элемент точечной пары. Если аргумент - атом, то функция неопределена.

Пример:

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

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

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

(CDR 'A)-> неопределено.

CAR всегда вернет атом, CDR вернет атом, если аргумент точечная пара, состоящая из двух атомов . Если аргумент - список, то CDR вернет хвост в виде списка.

2.2.7 Композиция функций саr и cdr.

Композиция функций CAR и CDR позволяет выделить любой элемент списка. Пусть существует переменная X, которая имеет значение

((LAMBDA (U V)(CONS U(CONS V NIL)))(ALPHA A)(BETTA B)),

тогда применяя функции CAR и СDR получим следующие результаты:

1.(CAR(CAR X))->LAMBDA

2.(CDR(CAR X))->((U V)(CONS U(CONS V NIL)))

3.(CAR(CDR X))->(ALPHA A)

4.(CDR(CDR X))->((BETTA B))

5.(CDR(CDR(CAR X)))->((CONS U(CONS V NIL)))

Существуют специальные функции, являющиеся сочетанием CAR и CDR: CAAR, CDAR, CADR, CDDR - примеры 1-4 соответственно.

Далее:

CAAAR CAAAAR

... 8 функций и ... 16 функций.

CDDDR CDDDDR

Например, имеется список X=(1 2 3 4 5). Тогда

(CAR X)->1,

(CADR X)->2,

(CADDR X)->3,

(CADDDR X)->4.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]