Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lisp_metod.doc
Скачиваний:
8
Добавлен:
12.11.2018
Размер:
326.66 Кб
Скачать

Лабораторная работа №3

I. Определение функций и их вычисление в Лиспе основано на исчислении Черча. В Лиспе -выражение имеет вид

(lambda (x1 x2 ... xn) fn),

где символ lambda означает, что мы имеем дело с определением функции, xi - формальные параметры, которые представлены в виде имен аргументов в описывающем вычисления теле функции fn. -выражение является определением безымянной функции, она не может быть вычислена без фактических параметров. После вычисления функция пропадает, ее нельзя вызвать по имени (в отличие от defun-определения функции).

Примеры:

1. $((lambda (x y)

(+ x y)) ; лямбда-определениие

2 3) ; аргументы

5 ; результат

  1. Телом лямбда-выражения является лямбда-выражение (вложенные вызовы):

$((lambda (y) ; тело (внешнего) лямбда-вызова вновь

((lambda (x) ; (внутренний) лямбда-вызов

(list y x)) ; и его тело.

‘ВНУТРИ)) ; аргумент

‘ВНЕ) ; аргумент (внешнего вызова)

(ВНЕ ВНУТРИ) ; результат

  1. Имя и значение символа

Значением константы является сама константа

Символ может обозначать произвольное выражение

SET - вычисляет имя и связывает его

SETQ - связывает имя, не вычисляя его

SETF - обобщенная функция присваивания

EVAL - вычисляет значение значения.

Примеры:

  1. $(set ‘функции ‘(car cdr cons atom eq))

/* Между символом функции и значением образована связь */

(CAR CDR CONS ATOM EQ)

$(set (car функции) ‘(поговорим немного))

/* вычисляется car от ранее вычисленного значения функции. Это есть CAR. Этому вычисленному значению присвоен список (поговорим немного) */

(ПОГОВОРИМ НЕМНОГО)

$(car функции)

CAR

$car

(ПОГОВОРИМ НЕМНОГО)

$функции

(CAR CDR CONS ATOM EQ)

  1. $(setq функции ‘(car cdr cons atom eq)) ;

/* Установлена связь между символом функции и значением (car cdr cons atom eq ), но вычисление символа функции автоматически блокировано */

(CAR CDR CONS ATOM EQ)

  1. $(‘(+ 2 3))

(+ 2 3)

(eval ‘(+ 2 3))

5

  1. Управляющие структуры в Лиспе.

 Последовательное исполнение: предложения

(PROG1 форма1 форма2 ... формаN) и

(PROGN форма1 форма2 ... формаN).

Переменное число аргументов этих форм вычисляются последовательно, возвращается значение первого аргумента для PROG1 и последнего - для PROGN.

Пример:

$(progn (setq x 2) (setq y (* 3 x)))

6

$x

2

Разветвление вычислений: условное предложение

(COND (p1 a1)

(p2 a2)

...

(pN aN))

Проверяется истинность выражений pi, вычисляется то выражение ai, для которого истинно условие (предикат) pi, вычисленное значение возвращается в качестве значения COND. Если ни одно из условий не выполняется, то значением COND будет NIL.

 Условное предложение (IF условие то-форма иначе-форма)

$(if (atom t) ‘атом ‘список)

АТОМ

 Циклическое выражение (LOOP m1 m2 ...) реализует цикл, в котором формы m1, m2, ... вычисляются снова и снова , пока в одной из форм не встретиться оператор завершения RETURN или другая форма, завершающая вычисления.

$(setq num 5)

$(loop ((zerop num)) ;zerop возвращает t, если num=0, иначе nil

(prin1 num) ;выводит на печать num, в той же строке

(space 2) ;в выходном потоке пропускает 2 озиции

(print (* num num)) ; выводит в выходной поток аргумент

; с переходом на новую строку

(decq num)) ;уменьшает значение аргумента на 1

Задание к выполнению лабораторной работы

1. Определить с помощью лямбда-выражения функцию, вычисляющую x+y-x*y

2. С помощью предложения COND определить функцию, которая возвращает в качестве значения столицу заданного аргументом государства.

  1. С помощью предложения PROGN реализовать следующий алго-ритм:

переменная n1 связана с суммой двух целых чисел, переменная n2 связана с произведением двух других чисел. Если n1<n2, то если n1 отрицательное число, то утраивается n2, иначе выдается сумма n1 и n2, иначе - разность n1 и n2.

  1. Определить функцию (ПРОИЗВЕДЕНИЕ n m), вычисляющую произведение целых положительных чисел.

5. Определить функцию expt2 (x n), вычисляющую возведение в степень n числа x. Определение осуществить с помощью цикла LOOP.

Замечание. Для п.3 используйте предикаты: (< n1 n2), вычисляющий Т, если n1<n2 , иначе NIL; (minusp n1) - T, если n1<0.

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