140 likes | 334 Vues
ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ. Функциональное программирование Григорьева И.В. В Лиспе используется передача параметров по значению Статические переменные локальны Свободные переменные меняют свое значение Динамическая и статическая область действия
E N D
ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.
В Лиспе используется передача параметров по значению • Статические переменные локальны • Свободные переменные меняют свое значение • Динамическая и статическая область действия • Одно имя может обозначать разные переменные
Статические переменные локальны • Формальные параметры функции в Коммон Лиспе называют лексическими или статическими переменными. Связи статической переменной действительны только в пределах той формы, в которой они определены. • Статические переменные представляют собой лишь формальные имена других лисповских объектов. После вычисления функции, созданные на это время связи формальных параметров ликвидируются и происходит возврат к тому состоянию, которое было до вызова функции.
Например: _(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
Упражнения • 1. В чем различия следующих типов переменных: а) статические переменные Ь) динамические переменные с) специальные переменные d) глобальные переменные е) свободные переменные • 2. Чем отличается статическое вычисление от динамического, если в функции нет свободных переменных?
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 у 'х) (g y) (f y)