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

Лисп – язык функционального программирования

В настоящем разделе рассматривается т.н. базовый Лисп, в таком виде как он был представлен МакКарти и незначительно расширен в последующих реализациях. Представлена только та часть Лиспа, которая позволяет разрабатывать программы функционального типа, без присваиваний, циклов, операторов ввода-вывода и других операторов, обеспечивающих взаимодействия с внешней средой.

Правильные выражения

Правильными выражениями Лиспа, т.е. теми, которые воспринимаются интерпретатором языка и могут быть вычислены являются атомы и списки. Атомы разделяются на 2 группы: символьные и числовые. Символьные атомы должны начинаться с букв, включают буквы, цифры и знак дефиса. Числовые атомы это целые числа или вещественные (с точкой и/или порядком). Числовые атомы можно указывать со знаком + или -. Списки представляют выражения в круглых скобках. Ограничителями, которые используются в языке являются (, ), .(точка), пробел и Enter. В языке могут использоваться спецзнаки, обычно для обозначения операций.

Списки

Списки строятся из атомов и списков. Для того, чтобы интерпретатор мог вычислить выражение-список необходимо чтобы были сбалансированы открывающие и закрывающие круглые скобки и с терминала или из другого входного потока был введен ограничитель Enter.

Пример

Ниже представлены списки, включающие атомы и списки:

(a b c d), (car (quote (p q r))), (x -4.5)

Для представления списков можно использовать точечную запись. Так, следующие далее выражения эквивалентны:

(b .(c .(d .nil))), (b c d), (b .(c d))

Атом nil используется для обозначения пустого списка (и одновременно значения «ложь»). Атом t используется в качестве представления значения «истина».

Выражения представленные списками могут быть вычислены только если в качестве первого элемента указана функция – встроенная (Лисповская) или определенная пользователем. В рассматриваемых далее примерах будем использовать следующую запись – «правильное выражение» -> «результат вычисления».

Пример

(plus 1 2 3) -> 6

(* (+ 1 2) (+ 3 4)) -> 21

(a b c) -> ошибка, т.к. а не имя функции.

В Лиспе имеются функции как с фиксированным числом аргументов (такие как +, *), так и с произвольным числом аргументов (например plus).

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

Пример

(quote a) -> a

‘a -> a

(quote a b) -> ошибка, т.к. quote требует единственного аргумента.

a -> ошибка, т.к. с а не связано никакого значения.

Обычно выражение, представленное символьным атомом трактуется как обращение к переменной. В то же время символьный атом на первом месте в списочном выражении трактуется как имя функции.

Базовые предикаты и конструкторы

Для работы со списками в Лиспе используются функции car, cdr и cons для вычисления первого элемента списка, хвоста списка или для включения элемента в список в качестве головного элемента.

Пример

(car ‘(p q r)) -> p

(cdr ‘(p q r)) -> (q r)

(car (cdr ‘(p q)) -> q

(cons ‘p ‘q) -> (p.q)

(cons ‘a ‘(b c)) -> (a b c)

(cons ‘(a b) ‘(c)) -> ((a b) c)

Для работы со списками необходимы следующие элементарные предикаты:

  • (atom x) – возвращает t, если x атом, иначе возвращает nil,

  • (eq x y) - возвращает t, если оба аргумента атомы и равны, иначе возвращает nil, т.е. выполняется проверка объектов данных на идентичность,

  • (eql x y) - возвращает t, если оба аргумента числа одного типа и равны,

  • (= x y) – применяется для сравнения разнотипных чисел,

  • (equal x y) - возвращает t, если оба аргумента структуры одинакового строения и равны (применяется для сравнения списков),

  • (null x) - возвращает t, если x пустой список, иначе возвращает nil.

Примеры

(atom nil) -> t

(null nil) -> t

(equal ‘x ‘x) -> t

(equal ‘(x y z) ‘(x y z)) -> t

(equal ‘(x y z) (cons ‘x ‘(y z))) -> t

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