Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа
Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.
1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.
3
PRINT является псевдофункцией,
у которой есть как побочный эффект, так
и значение. Значением функции является
значение ее аргумента, а побочным эффектом
- печать этого значения.
Функции PRIN1 и PRINC.
Эти
функции работают так же, как
PRINT, но не переходят
на новую строку и не выводят пробел:
(PRIN1 5) р 55
(PRINC
4) р
44
Обеими
функциями можно выводить кроме атомов
и списков и другие типы данных которые
мы рассмотрим позже:
_(PRIN1 «CHG») р «CHG»«CHG»
_(PRINC «tfd») р tfd«tfd» ;вывод без кавычек,
С
помощью функция PRINC можно получить более приятный
вид. Она выводит лисповские объекты в
том же виде, как и PRIN1, но преобразует некоторые
типы данных в более простую форму.
Функция TERPRI.
Эта
функция переводит строку. У функции TERPRI нет
аргументов и в качестве значения она
возвращает NIL:
_(DEFUN out (x y)
(PRIN1 x) (PRINC y)
(TERPRI) (PRINC (LIST ‘x ‘y)) р out
_(out 1 2) р 12
(1 2)
4. Вычисления, изменяющие структуру.
Основными функциями, изменяющими физическую структуру списков, являются RPLACA и RPLACD, которые уничтожают прежние и записывают новые значения в поля CAR и CDR списочной ячейки:
(RPLACA ячейка значение-поля) ;поле CAR
(RPLACD ячейка
значение-поля)
;поле CDR
Первым
аргументом является указатель на списочную
ячейку, вторым - записываемое в нее новое
значение поля CAR или CDR. Обе функции возвращают
в качестве результата указатель на измененную
списочную ячейку:
_(SETQ a ‘(b c d)) р (b c d)
_(RPLACA a ‘d) р (d c d)
_(RPLACD a ‘(o n m)) р (d o n m)
_a р (d
o n m)
5. Задания к лабораторной
работе.
1. Определите с помощью лямбда-выражения функцию, вычисляющую:
2. Определите функции (NULL x), (CADDR x) и (LIST x1 x2 x3) с помощью базовых функций. (Используйте имена NULL1, CADDR1 и LIST1, чтобы не переопределять одноименные встроенные функции системы.
3. Используя композицию, напишите функции, которые осуществляют обращение списка из 2, 3, ... , n элементов.
4. Используя композицию описанных выше предикатов и логических связок, постройте функцию, которая проверяет, является ли ее аргумент:
a) списком из 2, 3, ... элементов;
b)списком из 2, 3, ... атомов;
5. Напишите функцию:
6. Для каждого из следующих условий определить функцию одного аргумента L , которая имеет значение T, если условие удовлетворяется, и NIL в противном случае:
7. Напишите функцию, которая вводит фразу на естественном языке и преобразует ее в список.
8. Напишите функцию, которая спрашивает у пользователя ФИО студента из группы (список группы составлен раньше) и выдает следующие данные о нем:
9. Напишите функцию:
10. Каковы будут значения выражений (RPLACA x x) и (RPLACD x x), если:
11. Вычислите значение следующих выражений:
6. Вопросы.
1. Что такое лямбда-выражение?
2. Для чего используется функция DEFUN?
3. Чем различаются основные функции вывода?
4. Что возвращает в качестве значения функция READ?
5. Особенности функций, изменяющих структуру?
Лабораторная работа №3.
Тема: Организация вычислений в Лиспе.
Цель: Изучить основные функции и их особенности для организации вычислений в Лиспе.
1. Предложения LET и LET*.
2. Последовательные вычисления.
3. Разветвление вычислений.
4. Циклические вычисления.
5. Передача управления.
6. Задание к лабораторной работе.
7.
Вопросы.
1. Предложения LET и LET*.
Предложение LET создает локальную связь внутри формы:
(LET ((m1 знач1) (m2 знач2)...)
форма1 форма2 ...)
Вначале статические переменные m1, m2, ... связываются (одновременно) с соответствующими значениями знач1, знач2, ... . Затем слева на право вычисляются значения формы1, формы2, ... . Значение последней формы возвращается в качестве значения всей формы. После вычисления связи статических переменных ликвидируются.
Предложения LET можно делать вложенными одно в другое.
_(LET ((x ‘a) (y ‘b))
(LET ((z ‘c)) (LIST x y z))) р (a b c)
_(LET ((x (LET ((z ‘a)) z)) (y ‘b))
(LIST x y)) р (a b)
_(LET ((x 1) (y (+ x 1)))
(LIST x y)) р ERROR
При вычислении у У и Х еще нет связи. Значения переменным присваиваются одновременно. Это означает, что значения всех переменных mi вычисляются до того, как осуществляется связывание с формальными параметрами.
Подобной ошибки можно избежать с помощью формы LET*:
_(LET* ((x 1) (y (+ x 1)))
(LIST x y)) р
(1 2)
2. Последовательные вычисления.
Предложения PROG1 и PROGN позволяют работать с несколькими вычисляемыми формами:
(PROG1 форма1 ... формаN)
(PROGN форма1 ... формаN)
Эти
специальные формы последовательно вычисляют
свои аргументы и в качестве значения
возвращают значение первого (PROG1) или последнего (PROGN) аргумента.
_(PROG1 (SETQ x 1) (SETQ y 5)) р 1
_(PROGN
(SETQ j 8) (SETQ z (+x j))) р 9
3. Разветвление вычислений.
Условное предложение COND:
(COND (p1 a1)
...
(pn an))
Предикатами pi и результирующими выражениями ai могут быть произвольные формы. Выражения pi вычисляются последовательно до тех пор, пока не встретится выражение, значением которого является T. Вычисляется результирующее выражение, соответствующее этому предикату, и полученное значение возвращается в качестве значения всего предложения COND. Если истинного предиката нет то значением COND будет NIL.