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

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

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

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



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

Файлы: 1 файл

labs1d.doc

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

       Рекомендуется в качестве последнего предиката использовать символ 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), которое:

  1. дает NIL, если L атом, и T в противном случае;
  2. выдает для списка L ,состоящего из трех элементов, первый из этих трех, который является атомом, или список, если в списке нет элементов атомов.

       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)

                                                                (PRINT «среднее (1)»))

                                                 (IF (> y z) (PROGN (PRINT y)

                                                                                 (TERPRI)

                                                                                 (PRINT «среднее (2)»))

                                                                  (PROGN (PRIN1 z)

                                                                                 (PRIN1«среднее (3)»)))))

                           ((< x y) (IF (< y z) (PROGN (PRIN1 y)

                                                                       (TERPRI)

                                                                      (PRIN1 «среднее (4)»))

                                                 (IF (> x z) (PROGN (PRINC x)

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