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本身对#=的使用非常受限,并处于其能力的范围内。

...