为什么eval中的符号无法解决?

时间:2015-03-09 14:07:00

标签: clojure

为什么

((fn[x] (eval (symbol "x"))) 1)

炸毁Unable to resolve symbol: x in this context

我希望它表现得像

((fn[x] x) 1)  

并评估为1

(如何)修复前者以使用1返回eval

1 个答案:

答案 0 :(得分:2)

eval不使用调用它的词法范围(由fnletloop引入),它只会看到通过当前命名空间(绑定到var *ns*)。

将词法绑定引入eval上下文将涉及手动将表单包装在let中,或者使用未记录的实现依赖主机互操作来查找并提供与eval上下文的词法绑定。

手动包装的示例(仅当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