2014-02-20 48 views
0

我是clojure的新手,但我想知道是否可以設置命名空間範圍變量。有沒有辦法在clojure中設置命名空間範圍變量?

(ns robot.core) 

(def ^:dyanmic myar nil) 

(defn somefunction [] 
    (binding [myvar 1])) 

(defn -main [] 
    ((somefunction) 
    (println myvar)) 

運行將輸出nil,反正是有設定namespace'd變量或將他們需要到處傳遞到每一個功能?

+0

這是危險的,不是真的推薦! – Chiron

+0

@Chiron,什麼是「危險」? –

回答

1

alter-var-root功能可以改變根變量的結合:

(def ^:dyanmic *myvar* nil) 

(defn somefunction [] 
    (alter-var-root #'*myvar* (constantly 1))) 

(defn -main [] 
    (somefunction) 
    (println *myvar*)) 

binding功能,另一方面。允許您使用重定義的^:dyanmic變量運行一些代碼,而無需更改其核心綁定。

+0

僅供參考:'^:dynamic'是允許您使用綁定擁有線程局部唯一可見值的功能。你鏈接到的'alter-var-root'解釋了它實際上改變了var並且對所有線程都是可見的。 –

0

我不確定你想做什麼,但你知道:私人元數據?

(def ^:private wohoo "wohoo") 

and defvar-

我假設你想隱藏你的var從其他命名空間。

相關問題