我在ClojureScript中工作,其中ns-interns
是一个宏。
我正在尝试编写一个宏,它将获取命名空间内部绑定的信息,但我在编译时无法操作这些绑定。
(defmacro my-macro [namespace]
(let [mappings (ns-interns namespace)]
; do stuff
))
(my-macro 'mylib.hi)
问题在于上面的代码失败了,因为ns-interns
宏认为它在处理符号namespace
,而不是传递到my-macro
的命名空间。
我可以尝试
[mappings `(ns-interns ~namespace)]
,但这样我就不能在编译时展开宏到一个我可以用来生成代码的映射中 – 唯一能够做到的事情就是将在生成的代码中“打印”它。我尝试使用macroexpand
和macroexpand-all
,但它们对我没有用 – 我不能使用它们来获取ns-interns
的结果以在我的宏中使用。
然而,宏是可以展开的,因为以下代码在我的命名空间符号是硬编码的情况下会起作用。问题是我想将外部宏的参数传递到一个内部宏中。在ClojureScript中,如何在编译时获取和操作命名空间的vars并解决这个问题呢?
(defmacro my-macro [namespace]
(let [mappings (ns-interns 'mylib.hi)]
; do stuff
)
)