预定义使用Common Lisp宏自动生成的函数

时间:2015-03-17 15:37:22

标签: function macros common-lisp

宏可以在全局范围内创建函数。例如:

(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*))))

请注意,中间函数是在宏扩展时定义的。

1 个答案:

答案 0 :(得分:4)

如果需要在编译时在顶层定义函数,请使用:

(eval-when (:compile-toplevel)
  (defun foo ...))

请注意,您可以定义生成此类代码的宏。这样的表格可以是PROGN的一部分。