14731

Определение функций. Функции ввода-вывода. Вычисления, изменяющие структуру

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №2. Тема: Определение функций. Функции вводавывода. Вычисления изменяющие структуру. Цель: Получить навыки в написании функций. Изучить функции вводавывода. Функции определяемые пользователем. Функция ввода. Функции вывода. Вы...

Русский

2013-06-09

53 KB

6 чел.

Лабораторная работа №2.

Тема: Определение функций. Функции ввода-вывода. Вычисления, изменяющие структуру.

Цель: Получить навыки в написании функций. Изучить функции ввода-вывода.

  1.  Функции, определяемые пользователем.
  2.  Функция ввода.
  3.  Функции вывода.
  4.  Вычисления, изменяющие структуру.
  5.  Задание к лабораторной работе.
  6.  Вопросы.

  1.  Функции, определяемые пользователем.

Определение функций и их вычисление в Лиспе основано на лямбда-исчислении Черча.

В Лиспе лямбда-выражение имеет вид

(LAMBDA (x1 x2 ... xn) fn)

Символ LAMBDA означает, что мы имеем дело с определением функции. Символы xi являются формальными параметрами определения, которые имеют аргументы в описывающем вычисления теле функции fn. Входящий в состав формы список, образованный из параметров, называют лямбда-списком.

Телом функции является произвольная форма, значение которой может вычислить интерпретатор Лиспа.

_(lambda (x y) (+ x y))

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

Лямбда-выражение - это определение вычислений и параметров функции в чистом виде без фактических параметров, или аргументов. Для того, чтобы  применить такую функцию к некоторым аргументам, нужно в вызове функции поставить лямбда-определение на место имени функции:

(лямбда-выражение а1 а2 ... аn)

Здесь ai - формы, задающие фактические параметры, которые вычисляются как обычно.

_((lambda (x y) (+ x y)) 1 2) 3

Лямбда-вызовы можно свободно объединять между собой и другими формами. Вложенные лямбда-вызовы можно ставить как на место тела лямбда-выражения, так и на место фактических параметров.

_((lambda (x)                                                    ;Тело лямбда-вызова -

               ((lambda (y) (list x y)) ‘b)) ‘a) (a b)          лямбда-вызов.

Записывать вызовы функций полностью с помощью лямбда-вызовов не разумно, поскольку очень скоро выражения в вызове пришлось бы повторять, хотя разные вызовы одной функции отличаются лишь в части фактических параметров. Проблема разрешима путем именования лямбда-выражений и использования в вызове лишь имени.

Дать имя и определить новую функцию можно с помощью функции DEFUN:

(DEFUN имя лямбда-список тело)

DEFUN соединяет символ с лямбда-выражением, и символ начинает представлять определенные этим лямбда-выражением вычисления. Значением этой формы является имя новой функции.

После именования функции  ее вызов осуществляется по имени и параметрам.

_(defun list1 (x  y)

            (cons x (cons y nil))) list1

_(list1 ‘cn) (c n)

(eval <выражение>)

Функция возвращает результат выражения <выражение>, где <выражение> - любое выражение языка LISP. Например, дано:

(setq a 123)

(setq b 'a)

(eval 4.0) 4.000000

(eval (abs -10)) 10

(eval a) 123

(eval b) 123

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

  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;

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

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

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. Особенности функций, изменяющих структуру?


 

А также другие работы, которые могут Вас заинтересовать

3475. Государственное регулирование занятости и трудоустройства молодежи на рынке труда (на примере Агинского Бурятского Округа Забайкальского края) 97.6 KB
  Объектом исследования стала молодежь в возрасте от 16 до 30 лет. Предметом исследования является государственное регулирование занятости и трудоустройства молодежи на рынке труда в Агинском Бурятском округе.
3479. Определение коээфициента поверхностного натяжения жидкости по способу отрыва капли 185 KB
  Определение коээфициента поверхностного натяжения жидкости по способу отрыва капли Приборы и принадлежности: Бюретка с краном на штативе, два стакана, воронка, вода, исследуемая жидкость (спирт). Теория работы и описания приборов Жидкость состоит из...
3480. Физика среды и ограждающих конструкций, Строительная теплофизика 206 KB
  Физика среды и ограждающих конструкций. Среда и ее воздействие на объекты строительства. Воздушная среда и ее параметры. Водная среда и ее параметры. Климатические факторы. Влияние среды на долговечность строительных конструкций...
3483. Медична генетика 638 KB
  Залежність прояву ознак від впливу зовнішніх умов відзначав ще Ж.-Б.Ламарк, який розглядав це як один із еволюційних факторів. Учені давно помітили, що однояйцеві близнята, тобто організми з однаковим генотипом, відрізняються фенотипно, якщо розвива...