请在2024年Clojure现状调查!分享您的想法。

欢迎!有关此功能工作的更多信息,请参阅关于页面。

0
语法和读取器

函数的读时评估按预期工作。例如,将提交给REPL确实会返回2。然而,像(if true 1 0)这样的读时评估形式会产生错误。这些错误并不一致地反映在宏和特殊形式中。

#=(if true 1 0)
;;=> Can't resolve if
#=(let [] nil)
;;=> Wrong number of args (2) passed to: clojure.core/let

这是预期行为吗?像Common Lisp这样的语言,在类似场景下不会产生错误——例如,代码返回1

2 答案

+2

被选中
 
最佳答案

读-评估不是公共功能,通常不应该使用它。这与Common Lisp有很大的(而且是故意的)区别。它主要在一些内部特殊情况下使用,以读取缺少打印形式的Java对象的表单。

感谢你和Fogus迅速直接的回答!我真的希望我可以标记两条回答为最佳回答。 :)
标记Alex的回答更好,因为他使用了关键词"一般情况下不应使用" :)
+1 投票

Clojure 的 #= 读取形式没有文档说明,因此它的行为由其工作方式定义。目前实现方式是尝试将表单中的第一项解析为 Var(对静态方法和构造函数有一些特殊处理)。然而,由于 if 是特殊形式,其符号不会解析为 Var。即使解析为宏的符号,如 let,也会失败,因为 EvalReader 会尝试在解析的 Var 上调用 apply,而因为它是宏,所以不会工作。我认为这应该属于预期的行为类别,因为Clojure自身中使用 #= 非常受限,且处于其能力的边界内。

...