请在2024 Clojure 状态调查!分享您的想法。

欢迎!请查阅关于页面了解更多关于如何使用本网站的信息。

0
错误

我花了几分钟时间试图理解Clojure编译器给出的以下消息

编译器异常 java.lang.RuntimeException:不允许条件读取,正在编译:<文件名>

最终我意识到这是因为我在尝试在一个没有重命名为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 世界中的一个常用短语,我好奇为什么没有说 “读取器条件”,如果消息是关于这个的。

(一种选择是在错误字符串中添加注释,指出原因可能是用于.cljc文件之外的读者条件。不确定是否想在错误信息中使用“可能”或“可能”这类词汇,因为这可能会导致错误信息变得过长。然而,这种做法在其他地方已经实施,并且在这种情况下可能非常有用;误用.reader条件调用.clj文件似乎会经常发生。)

0
by
...