宏可以在全局范围内创建函数。例如:
(defmacro test-macro (&body functions)
`(progn ,@(loop for function in functions
collect `(defun ,function ()
*some-interesting-thing*))))
另一个例子(尽管有方法)将是CLOS类的自动生成的访问器。
函数不是在宏扩展时定义的,而是在编译/解释生成的代码时定义的。这可能会造成一些困难。如果预期会出现这些功能,则会发出警告。在正确定义这些函数之前定义这些函数的惯用方法是什么?一个可能的解决方案可能如下:
(defmacro test-macro (&body functions)
(macrolet ((empty-function (name)
`(defun ,name ())))
(dolist (function functions)
(empty-function function)))
`(progn ,@(loop for function in functions
collect `(defun ,function ()
*some-interesting-thing*))))
请注意,中间函数是在宏扩展时定义的。
答案 0 :(得分:4)
如果需要在编译时在顶层定义函数,请使用:
(eval-when (:compile-toplevel)
(defun foo ...))
请注意,您可以定义生成此类代码的宏。这样的表格可以是PROGN
的一部分。