2015-03-08 50 views
0

綁定變量,我這個宏命名空間中的聲明瞭一個名爲「助手」如何Clojure中的使用正申報和整個命名空間

(defmacro reply [name-key & arguments] ;;macro use BUS, it needs to be declared in this namespace 
    ~(<! (reply* (~name-key BUS) arguments))) 

我需要用它在其他命名空間中的「核心」之後,在這個初始化BUS與地圖命名空間,如果公交車在這個命名空間中聲明

(def BUS {:something "a"}) 
(reply ...) 

命名空間傭工只編譯......我可以聲明,然後在我的特定的命名空間初始化

***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) 

這是做到這一點的?

注意正確的方法:我已經通知比一些庫在科爾馬分貝達到這個目的,例如,你初始化數據庫路徑和配置的變量,那麼你可以使用它取決於該變量的不同功能....

的感謝!...

回答

0

我相信你正在尋找動態變量。

在您的 「幫手」 的命名空間,使用

(def ^:dynamic *bus*) 

創建宏之前聲明*bus*(不是 「總線」)。

然後,在您使用此命名空間,做

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

(注意binding是本地線程。)

在這種情況下,我也會使用指的「助手」具有合格名稱空間的:as快捷方式,以便更容易看到*bus*在其他位置定義。

+0

謝謝你的答覆..但使用綁定,我需要在一個綁定塊中附上我所有的宏調用否... ...我不明白如何實現像 (def BUS {:a「b」} ) (回覆...) – user1050817 2015-03-08 22:49:57

+0

嗯,是的,但是您可以將綁定表單儘可能地放在外面 - 如果您願意,甚至可以將它們放在主域中。 (綁定表單具有動態範圍,而不是詞法。) – bsvingen 2015-03-08 23:43:08

+0

您所建議的內容基本上會創建一個全局變量,並且您可能冒險將代碼的不同部分覆蓋彼此的值。動態範圍避免了這個問題,因爲一旦你離開綁定表單,var就會返回它的舊值。 – bsvingen 2015-03-08 23:45:22