2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多有关此内容的信息。

0
语法和分析器

函数的读时评估按预期工作。例如,将 #=(+ 1 1) 提交给 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 这样的语言在此场景中不会产生错误 - 例如代码 #.(if t 1 0) 返回 1

2 个答案

+2

被选中
 
最佳答案

读-评估不是公共特性,通常您不应使用它。这与 Common Lisp 形成重大(并且是有意为之的)差异。它主要用于内部某些特殊情况,以读取重建缺乏打印格式的 Java 对象的格式。

感谢你和Fogus快速直接的回答!我真希望能标记两个答案为最佳答案。 :)
标记Alex的答案更好,因为他使用了关键短语"通常你不应该使用它"。 :)
+1 投票

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

...