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

欢迎!请查看关于页面以了解更多关于如何工作的信息。

0
错误

我花了 few 分钟的困惑时间试图理解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 文件中定义,所以使用这个扩展名作为编译宏的提醒似乎是自然的。

我认为像“不允许读取器条件”这样的信息比“不允许条件读取”更容易理解。这至少会清楚地说明是读取器条件导致了问题。一旦你知道这意味着什么,这就会很明显,但“条件读取”在 Clojure 世界中不是一个常见的短语,据我所知,我很想知道为什么如果信息是关于读取器条件的,为什么不直接说“读取器条件”。

0

...