Основными конструкциями для определения локальных переменных являются let
и let*
. Другие операторы, полученные из let
, также связывают локальные переменные, такие как with-open-file
и destructuring-bind
. Конечно, lambda
и производные от него формы определения функций, такие как defun
, имеют параметры, и это локальные переменные. (Исторически lambda
существовал до let
).
В конструкции loop
локальные переменные могут быть определены с помощью предложения with
, например:
;; Like a hidden (let ((x 42) ...) in the code generated by loop:
(loop with x = 42 ...)
Это позволяет многим экземплярам loop
избегать окружения дополнительными let
и, таким образом, появляться более «аккуратно».
Локальные переменные также могут автоматически переходить через итерации loop
, что во многих случаях можно избежать включения неуклюжих setq
форм назначения, если лог c работает правильно:
;; x is initially 1, then 2, 3, ...
(loop with x = 1 then (+ 1 x) ...)
Глобальные переменные в Common Lisp определяются с использованием defvar
и defparameter
, а не простым присваиванием с помощью setf
или setq
.
Эффект простого выдачи setf
или setq
для переменной, которая ранее не была определена, подвержен неудачной "серой области" ANSI Lisp, и ведет себя по-разному в разных реализациях из-за разных интерпретаций этой серой области.
В некоторых реализациях setq
для неопределенной переменной создает диагностику c. В других случаях он создает специальную переменную, аналогично defparameter
, а в других случаях создает нечто, напоминающее «глобальную лексическую» переменную: символ получает привязку, но не помечается как специальная переменная, оставаясь доступным для лексическое связывание.