1 / 14

ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ

ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ. Функциональное программирование Григорьева И.В. В Лиспе используется передача параметров по значению Статические переменные локальны Свободные переменные меняют свое значение Динамическая и статическая область действия

olinda
Télécharger la présentation

ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

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

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

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

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

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

  14. 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)

More Related