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、通过load/compile .cljc、通过load/compile .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 文件中定义,所以使用这个扩展名作为宏将在编译时被提醒的提醒。

我认为像 "不允许读取器条件语句 ..." 这样的错误消息,比 "不允许条件读取" 容易理解得多。至少这会让问题清楚明显,那就是读取器条件语句造成了问题。一旦你知道了 "条件读取" 的意思是这个,那么很明显,但在 clojure 世界中,“条件读取” 并不是一个常见的短语,据我所知,我很好奇为什么它没有说 “读取器条件” 如果这正是消息要表达的内容。

(一个选项是在错误字符串中添加注释,说明原因可能是使用了位于 .cljc 文件之外的读者条件。不确定你是否希望在内疚消息中使用“可能是”、“可能”这类语言,因为这可能导致错误消息过长,难以控制。但是,此类方法在其他地方已得到应用,并且在这种情况下可能会非常有用;错误地将 .clj 与读者条件一起使用似乎是一项常见的操作。)

0 投票
...