如何使用let?
获取定义的局部变量的映射(let [foo 1] (println (get (get-thread-bindings) "foo")))
; prints nil
还有其他功能吗?或者有没有办法从get-thread-bindings映射中提取变量?任何解决方案也应该与嵌套的let语句一起使用。
答案 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}