В языках программирования в основном используются два способа передачи параметров - это передача параметров по значению и по ссылке. При передаче параметров по значению формальный параметр связывается с тем же значением, что и значение фактического параметра. Изменения значения формального параметра во время вычисления функции никак не отражаются на значении фактического параметра. С помощью параметров, передаваемых по значению, информацию можно передавать только внутрь процедур, но не обратно из них. При передаче параметров по ссылке изменения значений формальных параметров видны извне и можно возвращать данные из процедуры с помощью изменения значения формальных параметров.
В данном диалекте языка используется передача параметров по ссылке.
Формальные параметры функции называют лексическими или статическими переменными. Связи динамической переменной действительны только в пределах той формы, в которой они определены. Они перестают действовать в функциях, вызываемых во время вычисления, но текстуально описанных вне данной формы. Изменение значений переменных не влияет на одноимённые переменные вызовов более внешнего уровня. Динамические переменные представляют собой лишь формальные имена других лисповских объектов. После вычисления функции, созданные на это время связи формальных параметров ликвидируются и происходит возврат к тому состоянию, которое было до вызова функции. Например:
>(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)