【发布时间】:2015-03-19 15:51:38
【问题描述】:
下面的代码按预期打印 10。
(def x 10)
(let [y 30] (eval (symbol "x")))
下面的代码产生异常:
(let [y 20] (eval (symbol "y")))
Unable to resolve symbol: y in this context
这是预期的(但令人困惑!)。根据文档, let 定义的符号不属于任何命名空间,因此无法通过命名空间机制解析。
所以问题是:局部变量的函数符号应该是什么等价物。
另外:
我认为 Clojure 编译器在内部为每个标识符调用函数符号来“实习”它,但正如上面的示例所示,情况并非如此。好奇编译器实际上对本地标识符做了什么。我假设当我在 REPL 中输入 x
x
本质上是这样处理的:
(deref (resolve (symbol "x")))
但显然局部变量并非如此。
PS:Symbols in Clojure 不包括局部变量。
【问题讨论】:
标签: clojure