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”状态。