2015-08-18 42 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谢谢你! –