Ознакомительная работа в среде MuLisp

Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа

Описание работы

Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.



1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.

Файлы: 1 файл

labs1d.doc

— 151.50 Кб (Скачать файл)

       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. Определите с помощью лямбда-выражения функцию, вычисляющую:

  1. +y-x*y;
  2. x*x+y*y;
  3. x*y/(x+y)-5*y;

       2. Определите функции (NULL x), (CADDR x) и (LIST x1 x2 x3) с помощью базовых функций. (Используйте имена NULL1, CADDR1 и LIST1, чтобы не переопределять одноименные встроенные функции системы.

       3. Используя композицию, напишите функции, которые осуществляют обращение списка из 2, 3, ... , n элементов.

       4. Используя композицию описанных выше предикатов и логических связок, постройте функцию, которая проверяет, является ли ее аргумент:

         a) списком из 2, 3, ... элементов;

         b)списком из 2, 3, ... атомов;

       5. Напишите функцию:

  1. такую, что P(n) для произвольного целого n есть список из трех элементов, а именно: квадрата, куба и четвертой степени числа n;
  2. для двух аргументов значением которой является список из двух элементов (разности и остатка от деления);
  3. такую, что A(n) есть список (The answer is n). Так, значением (A 12) будет (The answer is 12);
  4. семи аргументов, значением которой служит сумма всех семи аргументов.

       6. Для каждого из следующих условий определить функцию одного аргумента L , которая имеет значение T, если условие удовлетворяется, и NIL в противном случае:

  1. n-ый элемент L  есть 12;
  2. n-ый элемент L есть атом;
  3. L имеет не более n элементов (атомов или подсписков).

       7. Напишите функцию, которая вводит фразу на естественном языке и преобразует ее в список.

       8. Напишите функцию, которая спрашивает у пользователя ФИО студента из группы (список группы составлен раньше) и выдает следующие данные о нем:

  1. год рождения;
  2. средний бал;
  3. родителей;
  4. списки свойств, присвоенные ему раньше.   

       9. Напишите функцию:

  1. от одного аргумента (ФИО любого студента), замещающую в списке с данными о нем (написанном раньше) подсписки со средними балами на списки свойств;
  2. вычисляющую средние балы, беря данные из списков свойств.

       10. Каковы будут значения выражений (RPLACA x x) и (RPLACD x x), если:

  1. x = ´(a b);
  2. x = ´(a);

       11. Вычислите значение следующих выражений:

  1. (RPLACD ‘(a) ‘b);
  2. (RPLACA ‘(a) ‘b);
  3. (RPLACD (CDDR ‘(a b x)) ‘c);
  4. (RPLACD ‘(nil) nil)
 

       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.

Информация о работе Ознакомительная работа в среде MuLisp