Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа
Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.
1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.
Рекомендуется в качестве последнего предиката использовать символ T. Тогда соответствующее ему an будет вычисляться в том случае, если другие условия не выполняются.
Если условию не ставится в соответствие результирующее выражение, то в качестве результата выдается само значение предиката. Если же условию соответствуют несколько форм, то при его истинности формы вычисляются последовательно слева на право и результатом предложения COND будет значение последней формы.
Предложения COND можно комбинировать.
(COND ((> x 0) (SETQ рез x))
((< x 0) (SETQ x -x) (SETQ рез х))
((= х 0))
(Т ‘ошибка))
Предложение IF.
(IF условие то-форма иначе-форма)
(IF (> x 0) (SETQ y (+ y x)) (SETQ y (- y x)))
Если выполняется условие (т. е. х>0), то к значению y прибавляется значение х, иначе (x<0) от y отнимается отрицательное значение х, т. е. прибавляется абсолютное его значение.
Можно использовать форму WHEN.
(WHEN условие форма1 форма2 ...
)
Выбирающее предложение CASE^
(CASE ключ
(список-ключей1 m11 m12 ... )
(список-ключей2 m21 m22 ... )
....)
Сначала
вычисляется значение ключевой формы
- ключ. Затем его сравнивают с элементами
списка-ключейi. Когда в списке найдено
значение ключевой формы, начинают вычисляться
соответствующие формы mi1,
mi2, ... . Значение последней
возвращается в качестве значения всего
предложения CASE.
_(SETQ ключ 3) р 3
_(CASE ключ
(1 ‘one)
(2 ‘(one + one) ‘two)
(3 ‘(two + one) ‘three) р three
4. Циклические вычисления.
Предложение DO.
(DO ((var1 знач1 шаг1) (var2 знач2 шаг2) ...)
(условие-окончания форма11 форма12 ...)
форма21 форма22 ...)
Первый аргумент описывает внутренние переменные var1, var2, ..., их начальные значения - знач1, знач2, ... и формы обновления - шаг1, шаг2, ....
Вначале вычисления предложения DOI внутренним переменным присваиваются начальные значения, если значения не присваиваются, то по умолчанию переменным присваивается NIL. Затем проверяется условие-окончания. Если оно действительно, то последовательно выполняются формы1i и значение последней возвращается в качестве значения всего предложения DO, иначе последовательно вычисляются формы2i.
На
следующем цикле переменным vari одновременно присваиваются
значения форм - шагi, вычисляемых в текущем
контексте, проверяется условие-окончания
и т. д.
_(DO ((x 5 (+ x 1)) (y 8 (+ y 2)) (рез 0))
((< x 10) рез)
(SETQ рез
(+ рез x y))
5. Передача управления.
На Лиспе можно писать программы и в обычном операторном стиле с использованием передачи управления. Однако во многих системах не рекомендуется использовать эти предложения, так как их можно заменить другими предложениями (например DO) и, как правило, в более понятной форме. Но мы рассмотрим предложения передачи управления, хотя использовать их не следует.
(PROG (m1 m2 ... mn)
оператор1
оператор2
...
операторm)
Перечисленные в начале формы переменные mi являются локальными статическими переменными формы, которые можно использовать для хранения промежуточных результатов. Если переменных нет, то на месте списка переменных нужно ставить NIL. Если какая-нибудь форма операторi является символом или целым числом, то это метка перехода. На такую метку можно передать управление оператором GO:
(GO метка)
GO не вычисляет значение своего «аргумента».
Кроме этого, в PROG-механизм входит оператор окончания вычисления и возврата значения:
(RETURN результат)
Операторы предложения PROG вычисляются слева направо (сверху вниз), пропуская метки перехода. Оператор RETURN прекращает выполнение предложения PROG; в качестве значения всего предложения возвращается значение аргумента оператора PROG. Если во время вычисления оператор RETURN не встретился, то значением PROG после вычисления его последнего оператора станет NIL .
После
вычисления значения формы связи программных
переменных исчезают.
6. Задания к лабораторной работе.
1. Запишите следующие лямбда-вызовы с использованием формы LET и вычислите их на машине:
a) ((LAMBDA (x y) (LIST x y)
‘(+ 1 2) ‘c);
b) ((LAMBDA (x y) ((LAMBDA (z) (LIST x y z)) ‘c)
‘a ‘b);
c) ((LAMBDA (x y) (LIST x y))
((LAMBDA (z) z) ‘a)
‘b).
2. Напишите с помощью композиции условных выражений функции от четырех аргументов AND4(x1 x2 x3 x4) и OR4(x1 x2 x3 x4), совпадающие с функциями AND и OR от четырех аргументов.
3. Пусть L1 и L2 - списки. Напишите функцию, которая возвращала бы T, если N-ые два элемента этих функций соответственно равны друг другу, и NIL в противном случае.
4. Написать условное выражение (используя COND), которое:
5. С помощью предложений COND или CASE определите функцию, которая возвращает в качестве значения столицу заданного аргументом государства.
6. Напишите с помощью условного предложения функцию, которая возвращает из трех числовых аргументов значение большего, меньшего по величине числа.
7. Запрограммируйте с помощью предложения DO функцию факториал.
8. Запишите с помощью предложения PROG функцию (аналог встроенной функции LENGTH), которая возвращает в качестве значения длину списка (количество элементов на верхнем уровне).
9. Используя функцию COND, напишите функцию, которая спрашивает у пользователя ФИО двух студентов из группы (список группы составлен раньше) для которых:
а) сравнивает год рождения и выдает результат (кто старше или что они ровесники);
б) сравнивает средний бал и выдает сообщение о результатах сравнения;
с) проверяет родственные связи (если одни и те же родители, то они родственники) и выдает об этом сообщение.
10. Напишите подобные функции, но уже используя функцию IF.
Для
двух последних заданий вывод информации
осуществить при помощью функций PRINT, PRIN1, PRINC.
Center - находит среднее из трех чисел:
(DEFUN center (x y z)
(COND ((> x y) (IF (< x z) (PROGN (PRINT x)
(IF (> y z) (PROGN (PRINT y)
((< x y) (IF (< y z) (PROGN (PRIN1 y)