Ниже объясняется , почему возникает ошибка, но обратите внимание, что редко требуется определять глобальные переменные изнутри функций, большую часть времени вы будете использовать локальную привязку с LET
.
Вот сокращенный тестовый пример:
(defun foo () (defvar bar nil) bar)
Во время компиляции foo
, bar
не определено (при условии свежей среды CL).Вот почему компилятор жалуется.Однако, если вы вызовете foo
, переменная будет объявлена (глобально), а затем будет возвращено ее значение.
Вызов DEFVAR
влияет на глобальныйсреда только тогда, когда она выполняется, или во время компиляции, когда она является формой верхнего уровня:
Однако описанные ниже побочные эффекты времени компиляции имеют место, только когда они появляются как формы верхнего уровня,
...
Побочные эффекты: Если форма defvar
или defparameter
отображается как форма верхнего уровня, компилятор должен распознать, что имя имеетбыл провозглашен особенным.Однако он не должен ни оценивать форму начального значения, ни назначать динамическую переменную с именем name во время компиляции.
Таким образом, компиляция вызова defvar
внутри тела функции не объявляет символ какспециальная переменная.