我在名为“helpers”
的命名空间中声明了这个宏(defmacro reply [name-key & arguments] ;;macro use BUS, it needs to be declared in this namespace
~(<! (reply* (~name-key BUS) arguments)))
我需要在在此命名空间中使用地图初始化BUS之后在其他命名空间“core”中使用它
(def BUS {:something "a"})
(reply ...)
如果在此命名空间中声明了BUS,则只编译命名空间帮助程序...我可以声明它然后在我的特定命名空间中初始化它
***helpers
(def BUS)
(declare BUS) ;;alternative
(defmacro reply... ) ;;using BUS in its body!
***other namespace
(def BUS {:a "b"})
(reply ...) ;; this macro use BUS
但是失败了
BUS already refers to: #'yourvertxproject.helper-fun/BUS in namespace: test1.core, compiling:(test1/core.clj:13:1)
这是正确的方法吗?...
注意:我注意到有些lib实现了这一点,例如在korma db中,你用db路径和配置初始化变量然后你可以使用依赖于这个变量的不同函数....
谢谢!......
答案 0 :(得分:0)
我相信你正在寻找动态变量。
在你的帮助&#34;命名空间,使用
声明*bus*
(不是&#34; BUS&#34;)
(def ^:dynamic *bus*)
在创建宏之前。
然后,在您使用它的命名空间中,执行
(binding [*bus* {:a "b"}]
...)
(请注意binding
是线程本地的。)
在这种情况下,我也会参考&#34;助手&#34;使用带有限定名称空间的:as
快捷方式,以便更容易看到*bus*
在其他位置定义。