为什么无法解析eval中的symbol?
Why can symbol in eval not be resolved?
为什么
((fn[x] (eval (symbol "x"))) 1)
炸毁Unable to resolve symbol: x in this context
?
我希望它表现得像
((fn[x] x) 1)
并评估为 1
。
(How) 前者可以用eval
固定为return 1
吗?
eval
不使用调用它的词法作用域(由 fn
、let
或 loop
引入),它只看到映射的变量通过当前命名空间(绑定到 var *ns*
)。
将词法绑定引入 eval 上下文将涉及手动将表单包装在 let
中,或使用未记录的依赖于实现的主机互操作来查找和提供词法绑定到 eval 上下文。
手动包装在 let 中的示例(这仅在 x
是 Clojure reader 可读的内容时有效):
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
为什么
((fn[x] (eval (symbol "x"))) 1)
炸毁Unable to resolve symbol: x in this context
?
我希望它表现得像
((fn[x] x) 1)
并评估为 1
。
(How) 前者可以用eval
固定为return 1
吗?
eval
不使用调用它的词法作用域(由 fn
、let
或 loop
引入),它只看到映射的变量通过当前命名空间(绑定到 var *ns*
)。
将词法绑定引入 eval 上下文将涉及手动将表单包装在 let
中,或使用未记录的依赖于实现的主机互操作来查找和提供词法绑定到 eval 上下文。
手动包装在 let 中的示例(这仅在 x
是 Clojure reader 可读的内容时有效):
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