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

Function 预定义使用通用Lisp宏自动生成的函数,function,macros,common-lisp,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)
 `(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*))))

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

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

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

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

您描述的问题(据我所知)不应该存在(根据规范),也不应该存在(在我所知道的任何实现中)。您能提供明确的代码示例吗?在大多数情况下,如果您在顶层使用
eval,您需要所有
(:编译顶层:加载顶层:执行)
@Svante:我不会这么说。常见的Lisp实现经常使用
:compile-top-level
,仅用于编译时的副作用。例如,
DEFUN
在编译时记录函数,但不定义它。通常,这是一个有用的模式。当
仅在所谓的顶层有意义时,
eval也有意义。除此之外,它没有任何实际用途。请注意,“toplevel”在编译上下文中具有特殊含义,并且
PROGN
中的表单仍处于“toplevel”状态。