- •Часть 1
- •Введение
- •1. Основы программирования на языке Лисп
- •1.1 Представление данных в Лиспе
- •1.2 Лямбда-исчисление и функциональное программирование
- •1.3 Пример простейшей программы на языке Лисп
- •2. Функции Лиспа
- •2.1 Функции отбора
- •2.2. Функции конструктора.
- •2.3 Функции компаратора.
- •2.4 Функции распознавателя.
- •2.5 Функции назначения.
- •2.6 Логические функции
- •2.7 Числовые функции
- •Задания к лабораторным работам по языку программирования лисп
- •Часть 1
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] ) возвращает n-й cdr элемент <списка>. Если <список> имеет 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