如何在命名空间中的clojure和未绑定变量中使用Forward声明

时间:2015-03-08 21:23:46

标签: clojure

我在名为“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路径和配置初始化变量然后你可以使用依赖于这个变量的不同函数....

谢谢!......

1 个答案:

答案 0 :(得分:0)

我相信你正在寻找动态变量。

在你的帮助&#34;命名空间,使用

声明*bus*(不是&#34; BUS&#34;)
(def ^:dynamic *bus*)

在创建宏之前。

然后,在您使用它的命名空间中,执行

(binding [*bus* {:a "b"}]
  ...)

(请注意binding是线程本地的。)

在这种情况下,我也会参考&#34;助手&#34;使用带有限定名称空间的:as快捷方式,以便更容易看到*bus*在其他位置定义。