Цитата(adejneka @ 18.8.2010, 21:53) | Выдает ошибку
Цитата | ; caught ERROR: ; (during macroexpansion of (FOO)) ; The variable *X* is unbound.
|
Под SBCL работает такой вариант:
Код | (eval-when (:compile-toplevel :load-toplevel :execute) (defvar *x* "x"))
(defmacro foo () (print *x*))
(foo)
|
Правда, я не уверен, что он будет работать под Allegro CL. |
действительно, если выполнить (load "file.lisp"), то ошибки не будет, а при (load (compile-file "file.lisp")) она появляется. причину можно увидеть так:
Код | CL-USER> (pprint (macroexpand '(defvar *x* 0)))
(PROGN (EVAL-WHEN (:COMPILE-TOPLEVEL) (SB-IMPL::%COMPILER-DEFVAR '*X*)) (EVAL-WHEN (:LOAD-TOPLEVEL :EXECUTE) (SB-IMPL::%DEFVAR '*X* (UNLESS (BOUNDP '*X*) 0) 'T NIL 'NIL (SB-C:SOURCE-LOCATION)))) ; No value CL-USER>
|
Цитата | Под SBCL работает такой вариант:
Код | (eval-when (:compile-toplevel :load-toplevel :execute) (defvar *x* "x"))
(defmacro foo () (print *x*))
(foo)
|
Правда, я не уверен, что он будет работать под Allegro CL.
|
скорее всего будет, но можно сделать и так:
тогда переменная будет определена во время чтения до раскрытия макр времени компиляции |