Macros 如何使用此宏解决实习问题?

Macros 如何使用此宏解决实习问题?,macros,package,common-lisp,symbols,Macros,Package,Common Lisp,Symbols,我在包“a”中定义了一个宏,它定义了一个函数“fun”。我想在包“b”中使用这个宏,希望在“b”中定义“fun”,但最终在“a”中定义它。有人能帮忙吗 以下是示例代码: (defpackage#:a(:use#:cl)(:export makefun)) (包装#:a) (defmacro makefun(&可选(名称(包名*包*)) `(defun fun) ,(格式为nil“hello~a”name))) (defpackage#:b(:use#:cl#:a)) (包装#:b) (macro

我在包“a”中定义了一个宏,它定义了一个函数“fun”。我想在包“b”中使用这个宏,希望在“b”中定义“fun”,但最终在“a”中定义它。有人能帮忙吗

以下是示例代码:

(defpackage#:a(:use#:cl)(:export makefun))
(包装#:a)
(defmacro makefun(&可选(名称(包名*包*))
`(defun fun)
,(格式为nil“hello~a”name)))
(defpackage#:b(:use#:cl#:a))
(包装#:b)
(macroexpand-1’(makefun));扩展到(DEFUN A::FUN()“hello B”)
(搞笑)
(乐趣);失败
(defpackage#:c(:use#:cl#:a))
(包装#:c)
(macroexpand-1’(makefun));扩展为(DEFUN A::FUN()“hello C”)
(搞笑)
(乐趣);失败

如果您真正想做的是让它在动态当前包中生成函数名,则您想执行以下操作:

(defmacro makefun (&optional (name (package-name *package*)))
  (let ((funn (intern (symbol-name 'fun) *package*)))
    `(defun ,funn ()
       ,(format nil "hello ~a" name))))

然而,这对我来说似乎是一个XY问题:我不知道您试图解决的问题是什么,但很可能有一个比许多不同的函数更好的解决方案,这些函数都具有相同的名称,但在不同的包中。

Do(import'a::fun)after(makefun)。这将把新创建的函数导入包:b中,然后您可以从:b调用(fun)。@Leo谢谢。在这种简单的情况下可能有效,但我恐怕不行。实际代码(makefun)使用包名访问特定于数据库的模式,这应该从多个包中调用。多个调用最终会在包“a”中相互覆盖。我将编辑代码以反映这一点。@Leo抱歉,我想问的是,多个调用不会在包“a”中互相覆盖吗?如果您想让FUN在包B中,那么您必须生成符号B::FUN。@rainer谢谢,这是否意味着专门导入它们,因为Leo提到的是唯一的解决方案?为什么包定义中的:use在这里没有帮助?有没有其他方法可以让我编写这段代码而不必担心跨多个包导入单个函数?谢谢你的帮助!