Передача параметров и область их действия

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

Динамические переменные локальны

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

>(nil defmethod не-меняет (x) ; x динамическая
  (nil  setq  x 'новое))
(lambda (x) (nil  setq  x 'новое))
>(nil setq  x 'старое)
nil
>(nil не-меняет 'аргумент)
nil
>x  ; первоначальная связь не меняется
старое

Свободные переменные меняют своё значение

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

>(nil defmethod изменить  ()  ; x свободная
  (nil  setq  x 'новое))
(lambda nil (nil  setq  x 'новое))
>(nil изменить)
nil
>x  ; значение свободной переменной изменилось
новое

Динамическая область действия

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

>(nil setq  x 100)  ; глобальное значение x
nil
>(nil defmethod первая  (x) ; динамическая x
  (nil  вторая  2))
(lambda (x) (nil  вторая  2))
>(nil defmethod вторая  (y) ; x свободна
  (nil  list  x y))
(lambda (y) (nil  list  x y))
>(nil первая  1)  ; используется глобальное значение x
(100  2)