【发布时间】:2015-03-09 14:07:00
【问题描述】:
为什么
((fn[x] (eval (symbol "x"))) 1)
炸毁Unable to resolve symbol: x in this context?
我希望它的行为就像
((fn[x] x) 1)
并评估为1。
(如何)可以将前者修复为使用eval返回1吗?
【问题讨论】:
标签: clojure
为什么
((fn[x] (eval (symbol "x"))) 1)
炸毁Unable to resolve symbol: x in this context?
我希望它的行为就像
((fn[x] x) 1)
并评估为1。
(如何)可以将前者修复为使用eval返回1吗?
【问题讨论】:
标签: clojure
eval 不使用调用它的词法范围(由fn、let 或loop 引入),它只看到通过当前命名空间映射的变量(绑定到变量@ 987654325@)。
将词法绑定引入 eval 上下文将涉及手动将表单包装在 let 中,或者使用未记录的实现依赖主机互操作来查找并提供到 eval 上下文的词法绑定。
手动包装 let 的示例(仅当 x 可以被 Clojure 阅读器读取时才有效):
user=> (def x 0)
#'user/x
user=> (let [x 42] (eval 'x)) ; gets the global value of x, not local
0
user=> (let [x 42] (eval (list 'let ['x (list 'quote x)] 'x))) ; manually getting the local
42
【讨论】:
(def x 3) ((fn[x] (eval (symbol "x"))) 1) 产生 3,而不是 1。
(eval (list 'let ['x x] 'x)
42。试试(Object.)。 :)