ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ Функциональное программирование Григорьева И.В.
В Лиспе используется передача параметров по значению В Лиспе используется передача параметров по значению Статические переменные локальны Статические переменные локальны Свободные переменные меняют свое значение Свободные переменные меняют свое значение Динамическая и статическая область действия Динамическая и статическая область действия Одно имя может обозначать разные переменные Одно имя может обозначать разные переменные
Статические переменные локальны Формальные параметры функции в Коммон Лиспе называют лексическими или статическими переменными. Связи статической переменной действительны только в пределах той формы, в которой они определены. Формальные параметры функции в Коммон Лиспе называют лексическими или статическими переменными. Связи статической переменной действительны только в пределах той формы, в которой они определены. Статические переменные представляют собой лишь формальные имена других лисповских объектов. После вычисления функции, созданные на это время связи формальных параметров ликвидируются и происходит возврат к тому состоянию, которое было до вызова функции. Статические переменные представляют собой лишь формальные имена других лисповских объектов. После вычисления функции, созданные на это время связи формальных параметров ликвидируются и происходит возврат к тому состоянию, которое было до вызова функции.
Например: _(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)