繁体   English   中英

为什么无法评估eval中的符号?

[英]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

(如何)前者可以固定为使用eval返回1吗?

eval不使用被调用的词法作用域(由fnletloop引入),它仅看到vars通过当前名称空间映射(绑定到var *ns* )。

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

手动包装let的示例(仅在Clojure读取器可以读取x情况下才有效):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM