2. Функция ввода.

Лисповская функция чтения READ обрабатывает выражение целиком. Вызов функции осуществляется в виде

_(READ)

(Вводимое выражение) р ;выражение пользователя

р (ВВОДИМОЕ ВЫРАЖЕНИЕ) ;значение функции READ

...


Функция не показывает, что она ждет ввода выражения. Она лишь читает выражение и возвращает в качестве значения само это выражение, после чего вычисления продолжаются.

Если прочитанное выражение необходимо сохранить для дальнейшего использования, то вызов READ должен быть аргументом какой-нибудь формы, например присваивания (SETQ), которая свяжет полученное выражение:


_(SETQ input (READ))

(+ 1 2) ;введенное выражение

(+ 1 2) ;значение

_input р (+1 2)


3. Функции вывода.

Для вывода выражений используют несколько функций: PRINT, PRIN1, PRINC.

Функция PRINT.

Это функция с одним аргументом, которая сначала вычисляет значение аргумента, а затем выводит это значение. Функция PRINT перед выводом аргумента переходит на новую строку, а после него выводит пробел. Таким образом, значение выводится всегда на новую строку.


_(PRINT (+ 1 2))

3 ;вывод

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

+y-x*y;

x*x+y*y;

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. Напишите функцию:

такую, что P(n) для произвольного целого n есть список из трех элементов, а именно: квадрата, куба и четвертой степени числа n;

для двух аргументов значением которой является список из двух элементов (разности и остатка от деления);

такую, что A(n) есть список (The answer is n). Так, значением (A 12) будет (The answer is 12);

семи аргументов, значением которой служит сумма всех семи аргументов.

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

n-ый элемент L есть 12;

n-ый элемент L есть атом;

L имеет не более n элементов (атомов или подсписков).

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

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

год рождения;

средний бал;

родителей;

списки свойств, присвоенные ему раньше.

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

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

вычисляющую средние балы, беря данные из списков свойств.

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

x = ’(a b);

x = ’(a);

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

(RPLACD ‘(a) ‘b);

(RPLACA ‘(a) ‘b);

(RPLACD (CDDR ‘(a b x)) ‘c);

(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)



Информация о работе «ЛИСП»
Раздел: Информатика, программирование
Количество знаков с пробелами: 170298
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
14593
2
12

... цифр с требуемым числом разрядов и, таким образом, запомнить любое самое большое число данной разрядности. Целью данной курсовой работы является ЛИСП-реализация конечных автоматов.1. Постановка задачи Конечный автомат – автомат, проверяющий допустимость слова на ленте, и возвращающий True / False (в данном случае Correct / Incorrect). Конечный автомат может двигаться по ленте только в одном ...

Скачать
16057
6
13

... При работе пользователя с базой данных над ее содержимым выполняются следующие основные операции: выбор, добавление, модификация (замена) и удаление данных. Целью данной курсовой работы является ЛИСП – реализация основных операций над базами данных. 1 Постановка задачи Требуется разработать программу, реализующую основные операции над базами данных: выбор, добавление, модификация и удаление ...

Скачать
14282
0
14

... новых рынков, биржевой игре, оценки политических рейтингов, выборе оптимальной ценовой стратегии и т.п. Появились и коммерческие системы массового применения. Целью данной курсовой работы является ЛИСП – реализация основных операций над нечеткими множествами. 1.Постановка задачи Требуется реализовать основные операции над нечеткими множествами: 1)   содержание; 2)   равенство; 3)   ...

Скачать
11806
0
10

... метода Ньютона на случай мнимых корней полиномов степени выше второй и комплексных начальных приближений. Эта работа открыла путь к изучению теории фракталов. Целью данной курсовой работы является Лисп – реализация нахождения корней уравнения методом Ньютона. 1. Постановка задачи Дано уравнение: . Требуется решить это уравнение, точнее, найти один из его корней (предполагается, что ...

0 комментариев


Наверх