如何獲取使用let定義的局部變量的映射?Clojure獲取本地允許
(let [foo 1] (println (get (get-thread-bindings) "foo")))
; prints nil
是否有另外一個功能呢?或者有沒有辦法從get-thread-bindings映射中提取變量?任何解決方案也應該使用嵌套的let語句。
如何獲取使用let定義的局部變量的映射?Clojure獲取本地允許
(let [foo 1] (println (get (get-thread-bindings) "foo")))
; prints nil
是否有另外一個功能呢?或者有沒有辦法從get-thread-bindings映射中提取變量?任何解決方案也應該使用嵌套的let語句。
正如評論中的鏈接所指出的,在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}
注意:在clojurescript中,你最終還會將函數本身作爲一個綁定(在一個函數內部)。 – ClojureMostly
Sooooo謝謝你! –
你的意思是這樣的:http://blog.jayfields.com/2011/02/clojure-and.html? – ClojureMostly