如何获取使用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