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

欢迎!请查看 关于 页面以了解此平台的更多信息。

0
错误

我在 Clojure 编译器显示的以下信息上花费了几分钟难以理解

CompilerException java.lang.RuntimeException: Conditional read not allowed, compiling: <filename>

最终我意识到这是因为我在没有重命名为 cljc 的 .clj 文件中尝试使用读条件表达式。我认为对于在混合 clj 和 cljc 代码库中工作的人来说,将此错误信息扩展为如下内容将非常有帮助:

"不允许在此上下文中进行读条件,因为文件扩展名不是 .cljc"

6 答案

0

评论来自:alexmiller

读器并不知道这一点 - 它可以通过多种方式调用(来自 repl、通过 clojure.core/read、通过 clojure.core/read-string、加载/编译 .cljc、加载/编译 .clj),因此这个描述在其中的某些情况下实际上是错误的。您似乎已经得到了一个相当好的错误信息 - 它告诉您问题所在并给了您文件名。

信息可以微调为类似于 "在这个上下文中不允许读条件" 的内容,这可能给您提供更好的提示。

0

评论来自:[email protected]

也许我不明白读器如何确定是否允许使用读条件,但这些似乎都有不允许的原因,并且会被不同的检查捕获。每个这些检查都可以给出一个更具体的警告来解释为什么不能读取?

反驳我的观点,看起来只有一个地方会抛出这个异常 - https://github.com/clojure/clojure/blob/7b9c61d83304ff9d5f9feddecf23e620c0b33c6e/src/jvm/clojure/lang/LispReader.java#L1406。我不确定这能否扩展到在不同错误情况中提供更多细节,或者那个信息是否在那个点不可用?

0
评论者:alexmiller

读取器使用一个选项映射调用,它将(或不会)有{:read-cond :allow}或{:read-cond :preserve}。这是读取器所拥有的唯一信息 - 如果设置了其中任何一个并且遇到读取器条件,它会抛出。

编译器决定在调用读取器时如何初始化这些选项。read和read-string的用户也会决定调用它时允许哪些选项。可以将更多信息传递给读取器,或者在编译器中捕获并重新抛出,但这两种方法都会复杂化这段已经是相当好的错误信息的代码。
0

评论来自:[email protected]

我同意这确实是一个合理的错误信息,我想我们可以等等看1.7发布后其他人怎么看待它。如果这对很多人来说都是一个问题,那么我们那时可以重新考虑这个问题?

0

评论者:mars0i

我在使用.clj文件中的读取器条件时遇到了问题。如果不是Daniel Compton关于此的博客文章,我根本不知道如何修复这个错误。我明白这不仅仅是一个文件名问题,而且这种错误还可以有其他来源,但如果确实是一个文件名问题,那就非常神秘,这似乎是一个容易犯的错误。一个相关的背景是Clojurescript宏可以在.clj文件中定义,所以使用这种扩展名作为宏将编译时的提醒是很自然的。

我认为像“Reader conditionals not allowed ...”这样的信息比“Conditional read not allowed”更容易理解。至少这会清楚地表明问题是出在读取器条件上。一旦你知道这是什么意思“条件读取”,这就很明显了,但“条件读取”在Clojure领域不是一个常见的短语,据我所知,我很好奇为什么它不说“reader conditional”,如果信息确实关于它的话。

(一种选择是在错误字符串中添加注释,说明原因可能是读者条件在外部cljc文件中使用。不确定是否想在错误消息中使用“可能是”/“可能”这条路,因为这类事情可能会失控并导致错误消息过长。然而,这种做法已在其他地方完成,并且在这种情况下可能非常有帮助;错误使用reader条件在.clj中看起来可能是经常发生的事情。)

0
...