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 对象的表单,而这些对象没有打印表单。

by
感谢你和Fogus迅速且直接的回答!真希望我能标记两个答案为最佳答案:)
by
标记Alex的回答较好,因为他使用了关键短语“一般来说你不应该使用它”:)
+1
by

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

欢迎使用Clojure问答社区,您可以在这里提问并获得Clojure社区成员的帮助。
...