Язык Лисп

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

называются формами.

Формой может быть переменная, т.е. атом-идентификатор, которому было присвоено значение одной из функций Лиспа (значением такой формы является текущее значение переменной). Формой является также список-обращение к функции вида(f a1, a2 ... an), где f - имя функции, а ai - ее аргументы (n?0). Программа на Лиспе представляет собой последовательность таких форм, и ее выполнение заключается в их вычислении.

В большинстве версий языка Лисп имеется много встроенных (стандартных) функций, на основе которых составляется программа. Все они есть в наиболее известных версиях Лиспа, таких как Common Lisp и MuLisp [5].

Для определения новых функций используется встроенная функция defun, к которой возможны следующие (равноценные) обращения: (defun f (lambda (v1 v2 ... vn) e)) или (defun f (v1 v2 ... vn) e).

Вычисление функции defun в качестве побочного эффекта приводит к появлению в программе новой функции с именем f ; vi - формальные параметры новой функции (n?0), а e - форма, зависящая от vi. Таким образом, определяется обычная ЛИСП-функция, т.е. функция с фиксированным количеством аргументов, которые всегда вычисляются при обращении к ней.

При последующем обращении к этой уже определенной функции (f a1 a2 ... an) сначала вычисляются аргументы (фактические параметры) ai, затем вводятся локальные переменные vi, которым присваиваются значения соответствующих аргументов ai, и далее вычисляется форма e при этих значениях переменных vi, после чего эти переменные уничтожаются. Значением данной формы становится значение функции f при аргументах ai.

Операции над списками (car l) - значением аргумента l должен быть непустой список, тогда значением функции является первый элемент (верхнего уровня) этого списка (cdr l) и значением функции является "хвост" этого списка, т.е. список, полученный отбрасыванием первого элемента [6].

Кроме этих двух функций-селекторов элементов списка часто используются функции, являющиеся их суперпозициями. Имена всех таких функций начинаются на букву c, а заканчиваются на букву r, между ними же может стоять произвольная комбинация из не более чем 5 букв a и d, например, (cadar l)?(car(cdr(car l))) .

Предполагается, что список-аргумент l всех этих функций, так же как и следующей функции nth, содержит необходимое число элементов (в противном случае вычисления прерываются).

(nth n l) - значением аргумента n должно быть положительное целое число (обозначим его N), а значением аргумента l - список. Значением функции является N-й от начала элемент этого списка.

(last l) - функция выбирает последний (от начала) элемент списка, являющегося значением ее аргумента. программирование диалект язык лисп

(cons e l) - в отличие от предыдущих функций эта функция является конструктором, т.е. строит новый список, который и выдает в качестве своего результата. Первым элементом этого списка будет значение аргумента e, а хвостом списка - значение аргумента l . Например, (append l1 l2)

Эта функция осуществляет слияние (конкатенацию) двух списков, являющихся значением двух ее аргументов.

(list e1 e2 ... en ) - еще одна функция конструктор, она имеет произвольное количество аргументов, из их значений она строит список (количество элементов результирующего списка равно количеству аргументов).

1.2 Арифметические функции

(add1 n) - значением аргумента этой функции должно быть число, функция прибавляет к этому числу 1 и выдает результат в качестве своего значения.

(sub1 n) - значением аргумента должно быть число, функция вычитает из него 1 и выдает результат в качестве своего значения.

(+ n1 n2) - значениями обоих аргументов функции должны быть числа, результат вычисления функции - их сумма.

(- n1 n2) - значениями аргументов должны быть числа, значение функции - их разность.

(length l) - значением аргумента l должен быть список, значением функции является количество элементов (верхнего уровня) этого списка, например:

(mod n1 n2) - значениями обоих аргументов функции должны быть целые числа. Функция выполняет деление нацело первого числа на второе, и результат выдает в качестве своего значения.

(rem n1 n2) - значениями аргументов функции должны быть целые числа, результат вычисления функции - остаток от деления первого числа на второе.

1.3 Логические функции

Предикатом обычно называется форма, значение которой рассматривается как логическое значение "истина" или "ложь". Особенностью языка Лисп является то, что "ложью" iитается пустой список, записываемый как () или nil, а "истиной" - любое другое выражение (часто в этой роли выступает атом T) [5].

(null e) - эта функция проверяет, является ли значение ее аргумента пустым списком: если да, то значение функции равно T, иначе - ().

(eq e1 e2) - функция сравнивает значения своих аргументов, которые должны быть атомами-идентификаторами. В случае их совпадения (идентичности) значение функции равно T, иначе - ().

(eql e1 e2) - в отличие от предыдущей функции eql сравнивает значения своих аргументов, которыми могут быть не только атомы-идентификаторы, но и атомы-числа. Если они равны, то значение функции равно T, иначе - ().

(equal e1 e2) - пункция производит сравнение двух произвольных S-выражений - значений своих аргументов. Если они равны (имеют одинаковую структуру и состоят из одинаковых атомов), то значение функции равно T, иначе - ().

(neq e1 e2) - аналог, но значения аргументов сравниваются на "не равно".

Функция (member a l) производит поиск атома, являющегося значением первого ее аргумента, в списке (на верхнем его уровне), являющемся вторым аргументом.