Я написал макрос и функцию в одном файле следующим образом:
(defun test ()
(let ((x '(1 2 3)))
(macro-test (x real-b)
(print (+ 1 (car real-b))))))
(defmacro macro-test ((a b) &body body)
`(do ((,b ,a (cdr ,b)))
((not ,b))
,@body))
Затем я загружаю этот файл в repl и запускаю (test)
. Я получил эту ошибку:
The variable REAL-B is unbound.
Однако, когда я поставил defmacro
перед defun
. Все хорошо.
Я запутался в общем порядке компиляции lisp. Я знаю, что если defmacro
использует некоторые функции внутри, эти функции должны (eval-when (:compile-toplevel :load-toplevel :execute))
, иначе компиляция не удалась бы.
Однако, если определения макросов и определения функций совпадают во время компиляции, порядок имеет значение, верно? Макрос должен находиться в том месте, где он используется (если я создаю две функции, порядок не имеет значения). Могу ли я получить более подробную информацию о порядке компиляции SBCL? И это только для SBCL? Или в стандарте Common Lisp?
Спасибо!