【发布时间】:2015-05-20 03:11:07
【问题描述】:
宏可以在全局范围内创建函数。例如:
(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*))))
注意中间函数是在宏扩展时定义的。
【问题讨论】:
-
您描述的问题(据我了解)不应该存在(根据规范)并且不存在(在我知道的任何实现中)。您能否提供明确的代码示例?
标签: function macros common-lisp