Clojure得到本地的让

时间:2015-08-18 13:15:03

标签: clojure

如何使用let?

获取定义的局部变量的映射
(let [foo 1] (println (get (get-thread-bindings) "foo")))
; prints nil

还有其他功能吗?或者有没有办法从get-thread-bindings映射中提取变量?任何解决方案也应该与嵌套的let语句一起使用。

1 个答案:

答案 0 :(得分:9)

正如评论中的链接所指出的那样,&env中有一个特殊的defmacro变量。根据{{​​3}}:

  

defmacro中有两个特殊变量可供更高级   用途:

     
      
  • & form - 正在调用的实际表单(作为数据)
  •   
  • & 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}