Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

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

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

Вычисления, изменяющие структуру.

Задание к лабораторной работе.

Вопросы.

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

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

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

(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 ‘c ‘n) ð (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

 

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

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

_(READ)

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

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

...

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

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

 

_(SETQ input (READ))

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

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

_input ð (+1 2)

 

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

Для вывода выражений используют несколько функций: 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)

 

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...