ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.

Презентация:



Advertisements
Похожие презентации
ИМЯ И ЗНАЧЕНИЕ СИМВОЛА Функциональное программирование Григорьева И.В.
Advertisements

ФУНКЦИИ БОЛЕЕ ВЫСОКОГО ПОРЯДКА Функциональное программирование Григорьева И.В.
Определение функций Функциональное программирование Григорьева И.В.
ВЫЧИСЛЕНИЕ В ЛИСПЕ Функциональное программирование Григорьева И.В.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
ОТОБРАЖАЮЩИЕ ФУНКЦИОНАЛЫ. Важный класс функционалов в практическом программировании на языке Лисп образуют отображающие функции или МАР-функции. МАР-функционалы.
ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ СПИСКОВ. Лисповская память состоит из списочных ячеек Лисповская память состоит из списочных ячеек Значение представляется указателем.
ДРУГИЕ ФОРМЫ РЕКУРСИИ I Функциональноепрограммирование Григорьева И.В.
Основы программирования в Лиспе. Функции. Рекурсия Лекция 11.
Другие формы рекурсии II Функциональное программирование Григорьева И.В.
Связанные и свободные переменные n λv.B n Переменная v называется связанной всюду в теле B функции λv.B, за исключением подвыражений B, где v переопределяется.
Подпрограммы: процедуры и функции Информатика. 1. Подпрограммы При решении различных задач часто возникает необходимость проводить вычисления по одним.
Процедуры и Функции Подпрограмма, задаваемая с помощью ключевого слова Sub (subprogram), называется процедурой, а с помощью ключевого слова Function -
Базовые функции Функциональное программирование Григорьева И.В.
ПРОЦЕДУРЫ И ФУНКЦИИ CPascal Подпрограмма – группа операторов реализующая законченный алгоритм и оформленная как самостоятельная синтаксическая единица.
Функциональное программирование МарГТУ2009 г. 1 Функции. Базовые функции. Лекция 2.
МЕТОДЫ ОПТИМИЗАЦИИ § 1. Основные понятия. Под оптимизацией понимают процесс выбора наилучшего варианта из всех возможных В процессе решения задачи оптимизации.
Потоки Язык C++ не обеспечивает средств для ввода/вывода Ему это и не нужно; такие средства легко и элегантно можно создать с помощью самого языка Традиционно.
Лекция 8 Область видимости Время жизни. Область видимости Область видимости – характеристика именованного объекта Область видимости - часть текста программы,
Языки и методы программирования Преподаватель – доцент каф. ИТиМПИ Кузнецова Е.М. Лекция 5.
Транксрипт:

ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.

В Лиспе используется передача параметров по значению В Лиспе используется передача параметров по значению Статические переменные локальны Статические переменные локальны Свободные переменные меняют свое значение Свободные переменные меняют свое значение Динамическая и статическая область действия Динамическая и статическая область действия Одно имя может обозначать разные переменные Одно имя может обозначать разные переменные

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

Например: _(defun неменяет (x) (setq x НОВОЕ)) НЕМЕНЯЕТ _(setq x СТАРОЕ) СТАРОЕ _(неменяет НОВОЕ) НОВОЕ_XСТАРОЕ

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

Например: _(defun изменить () (setq x НОВОЕ)) ИЗМЕНИТЬ _(изменить) НОВОЕ НОВОЕ_X

Динамическая и статическая область действия Под вычислительным окружением или контекстом будем понимать совокупность действующих связей переменных с их значениями. Связи формальных параметров вызова со значениями аргументов действительны (по умолчанию) только в пределах текста определения функции. Будем говорить, что область действия или видимость переменных статическая.

В Коммон Лиспе существует однако возможность использования динамических, или специальных, переменных. Это обычно достигается при помощи директивы (DEFVAR переменная &OPTIONAL начальное значение) Если переменная при помощи DEFVAR объявлена динамической, то связь, установленная в более внешнем вызове, остается в силе для всех вложенных контекстов, возникающих во время вычисления (при условии, что эта переменная снова не связывается).

Например: _(setq х 100) 100 _(defun первая (х) (вторая 2)) ПЕРВАЯ _(defun вторая (у) (list х у)) _(первая 1) (100 2 _(defvar x 100) _(первая 1) ; X определяется динамически (1 2) ; по последней связи

Одно имя может обозначать разные переменные Интересные различия возникают в использовании статических и глобальных (динамических) переменных, когда один и тот же символ является и фактическим, и формальным параметром: _(setq х...) ; глобальная X … _(defun fn (х)...) ; статическая X FN _(fn 'x); статическая X связывается...; с глобальной X В случае, подобном приведенному, X в функции FN может быть именем как статической, так и глобальной (или динамической) переменной.

_(setq х 'старое) СТАРОЕ _(defun set-dyn (x) (set х 'новое)) SET_DYN; меняет динамическую X _(set-dyn 'x) НОВОЕ _ x НОВОЕ Все участвующие в вычислениях переменные, как и первый фактический параметр вызова SET в предыдущем примере, являются динамическими. Сослаться на статическую переменную можно лишь в форме, не вычисляющей своих аргументов, такой как SETQ.

Следующая функция SET-DYN работает точно так же, как и предыдущая, так как значение первого аргумента вызова функции SET ссылается не на статическую переменную X, а на динамическую: _(defun set-dyn (x) (set (саг '(х у)) 'новое)) Функция QUOTE также возвращает в качестве значения лишь динамическую переменную, что видно из следующего примера: _(defun проба-eval (х) (eval 'х)) ПРОБА-EVAL _(setq х 'старое) ; динамическая связь X СТАРОЕ _(проба-eval 'новое) ; аргументом EVAL СТАРОЕ ; является не статическая, ; а динамическая X ; а динамическая X

Упражнения 1.В чем различия следующих типов переменных: 1.В чем различия следующих типов переменных: а) статические переменные Ь) динамические переменные с) специальные переменные d) глобальные переменные е) свободные переменные 2.Чем отличается статическое вычисление от динамического, если в функции нет свободных переменных? 2.Чем отличается статическое вычисление от динамического, если в функции нет свободных переменных?

3. Определим функции F и G следующим образом: 3. Определим функции F и G следующим образом: (defun f (у) (g у)) (defun g (x) (list x у)) Какое значение или сообщение об ошибке будет результатом следующих вызовов функций F и G: a) (f 'у) b) (f (setq у 'у)) c) (g 'у) d) (g (setq y 'y)) е) последовательное вычисление (setq у 'х) (setq у 'х) (g y) (g y) (f y) (f y)