IllegalStateException:尝试在宏中调用未绑定的fn

Ken*_*Ken 7 macros clojure

我正在尝试编写一个调用某些函数的宏.这些函数只能由宏使用,所以我将它们放在letfn包装宏中.伪代码:

(letfn [(fn-a [] ...)
        (fn-b [] ...)
        (fn-c [] (fn-b))]
  (defmacro my-macro [stuff]
   `(let [whatever# (fn-a)]
      (fn-c))))
Run Code Online (Sandbox Code Playgroud)

调用fn-afn-c工作,但是当fn-c试图调用fn-b我得到IllegalStateException:试图调用未绑定的fn:#'name.space/fn-b.这是为什么?

如果我把fn-bfn-c自己的defnS,一切正常.但我不想这样做,因为它不干净.

编辑:只是为了测试,我尝试将函数绑定放在内部,let但遇到了同样的异常.

小智 3

我认为这种方式根本行不通。对 example 的调用fn-c扩展为your.namespace/fn-c,因此您的代码似乎调用了恰好具有相同名称的其他函数。但你没有your.namespace/fn-b,这会引发异常。

要引用非限定符号,您需要引用和取消引用它:~'fn-a 但这也不起作用,因为局部函数在扩展时没有定义,您只能将它们用于宏本身。

您要么必须在命名空间中定义函数并在宏中限定它们,要么将它们包含在宏扩展中,这将在每次使用时再次定义它们。