Вы можете сделать что-то вроде:
(defmacro testing (&optional var)
`(if (consp ,var)
'(this is a list)
'(this is)))
Таким образом, var
будет оцениваться во время выполнения (не во время компиляции). var
появляется только один раз в расширении макроса, но если бы он появлялся более одного раза, вам пришлось бы использовать gensym.
РЕДАКТИРОВАТЬ: Если вы не хотите вводить '(this is)
дважды, сделайте это:
(defmacro testing (&optional var)
`(append '(this is) (when (consp ,var) '(a list))))
Не используйте eval
, это медленно и совершенно не нужно. Подставив var
в расширение макроса, он, естественно, будет оцениваться во время выполнения. Если вы используете eval, вы будете делать что-то вроде этого:
(eval (append '(list 'this 'is) (when (consp 'bla) '('a 'list))))
Каждый раз, когда выполняется 1018 *, он создает список, представляющий код, и компилирует его перед запуском. (Надеюсь, это не в цикле!) Если вы просто используете макрос, который генерирует простой код (без eval
), он будет скомпилирован только один раз.