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

Определяющие выражения функций

Определяющие выражения функций в Лиспе (лямбда-выражения) напоминают лямбда-термы в лямбда-исчислении:

(lambda (список-атомов) выражение),

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

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

((lambda (u v) (cons (car u) (cdr v))) ‘(p q r) ‘(pp qq rr)) -> (p qq rr)

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

(cons (car ‘(p q r)) ‘(cdr ‘(pp qq rr)) ) -> (p qq rr)

Условные выражения

В реализациях функций не обойтись без условных вычислений. В начальных версиях Лиспа этой цели служит форма cond:

(cond (p1 t11 t12…) (p2 t21 t22…)…(pn tn1 tn2…)),

где p1, p2, …, pn – произвольные выражения, интерпретируемые как предикаты и вычисляемые в порядке перечисления. Как только некоторый предикат pi возвращает значение отличное от nil вычисляется вся последовательность выражений ti1 ti2…и результатом вычисления всей формы является последнее выражение последовательности ti1 ti2…. Форма возвращает nil, если не вычислялось ни одно из выражений любой из последовательностей.

Пример

(cond ((= 3 4) 3) ((= 1 2) 5)) -> nil

В современных версиях Лиспа применяются одновременно с формой cond и другие, более простые формы if, when, unless, для которых мы укажем их cond-эквивалент:

(if p1 e1 e2) @ (cond (p1 e1) (t e2))

(when p1 e1 e2 …) @ (cond (p1 e1 e2 …) (t nil))

(unless p1 e1 e2 …) @ (cond ((not p1) e1 e2 …) (t nil))

Пример

((lambda (x) (if (< x 0) (- 0 x) x)) -4) -> 4

Выражения для представления циклов

В случае повторяющихся вычислений в Лиспе используются рекурсивные функции. Вместе с тем имеются и формы, похожие на операторы циклов в процедурных языках:

(do (( v1 b1 s1 ) (v2 b2 s2)…)

(c f f2 ...) e1 e2 …en )

где v1, v2, - переменные цикла,

bi - начальные значения переменных,

si - формы вычисления последующих значений переменных,

c - условие завершения цикла,

fi, ei - произвольные выражения.

На каждом шаге вычисляется значение vi – e.

Если значение с не равно nil, то последовательно вычисляются fi-e и значение последнего и есть значение всего do. Если значение с равно nil, то вычисляется ei - e и затем цикл повторяется

Пример

Вычисление n- й степени числа (n>1)x:

(do ((res x (times res x ))(cnt n (sub1 cnt)))

((eql cnt 1) res )); условие окончания.

В выражении не содержится тело цикла. Имеются переменные и условия окончания. Переменные х и n не связанные в цикле (свободные). Они должны быть определены где-либо вне цикла, но до его выполнения. В программе использованы стандартные функции Лиспа

  • times - произведение,

  • sub1 - вычитание 1, но без воздействия на саму переменную,

  • eq - эквивалентность.

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