2015-08-18 74 views
4

如何獲取使用let定義的局部變量的映射?Clojure獲取本地允許

(let [foo 1] (println (get (get-thread-bindings) "foo"))) 
; prints nil 

是否有另外一個功能呢?或者有沒有辦法從get-thread-bindings映射中提取變量?任何解決方案也應該使用嵌套的let語句。

+0

你的意思是這樣的:http://blog.jayfields.com/2011/02/clojure-and.html? – ClojureMostly

回答

8

正如評論中的鏈接所指出的,在defmacro內有一個特殊的&env變量。每documentation

兩個特殊的變量是更先進的 用法可用內defmacro:

  • &形式 - 實際形式(數據)被調用
  • & ENV - 一個宏擴展點處的本地綁定映射。環境圖 從符號到持有關於該綁定的編譯器信息的對象。

你可以用它來編寫一個宏,將擴大給你點本地綁定的映射,其中展開宏:

(defmacro get-env 
    [] 
    (into {} (for [k (keys &env)] 
      [(name k) k]))) 

這擴大爲地圖的象徵名稱(name k)爲符號k,用於所有本地綁定(keys &env),當它們被評估時,將給符號的當前綁定的符號名稱映射。

user> (get-env) ; => {} 
user> (let [a 1] (get-env)) ; => {"a" 1} 
user> (let [a 1 b 2] 
     (let [b 3 c 4] (get-env))) ; => {"c" 4, "b" 3, "a" 1} 

它甚至與功能參數的工作原理:

user> (defn foo [x] (let [y 1] (get-env))) 
user> (foo 2) ; => {"y" 1, "x" 2} 
+0

注意:在clojurescript中,你最終還會將函數本身作爲一個綁定(在一個函數內部)。 – ClojureMostly

+0

Sooooo謝謝你! –