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

欢迎!请参阅关于页面以了解更多关于本站如何运行的信息。

+1投票
错误
编辑

(.a ""),当然,会抛出IllegalArgumentException异常,但没有:phase

然而,可以考虑这种IllegalArgumentException是“编译器-like”,尽管它在更多“运行时-like”情况下抛出的其他IllegalArgumentException中似乎并不主要区分。

问题在于,作为工具制造商,如果没有这种区别,所有IllegalArgumentException都将受到相同处理,而用户希望对于类似于编译器的那些给以更加简洁的处理(例如,不显示回溯)。

  • 有没有推荐的方式去检查运行时异常,以确定他们是否代表从用户视角看来,“本身无效”的代码所表示的内容?
    • (这是一个非正式的术语,用来描述类似于编译器的运行时异常)
  • 是否考虑过通过在Clojure编译器/运行时可以可靠地做到的时候,附加一个:cause(或其他,如:phase:ex-data等)使得这个问题更简单?

2 个回答

0投票

我不会将其视为“一开始就无效的代码”或编译器类的代码。这是一段语法有效的代码。如果成员不被识别,它将回退到反射调用,这可能在运行时失败。因此,你可以将其视为“Clojure运行时异常”或类似的东西,但我们没有在这情况下发生任何一致的事情,而且可能有一百多个类似的地方。

通常不会捕获运行时异常,因为我们希望流动抛出的内容。也许在Clojure运行时抛出一个携带额外信息的标准异常会有所帮助,但我不确定在这个阶段是否可行更改。

by
>> 当成员不被识别时,它将回退到可能失败的运行时反射调用。

那么,如果对象的类型在编译时已知的呢?`(.a "")`对我来说感觉像“编译器类的代码”,因为我们一开始就知道`java.lang.String`上的成员,而`.a.`不是其中之一。当它是`(.a someObj)`时,回退到反射调用是有意义的,但在已知类型的情况下,为什么还要回退到反射调用呢?
0投票
by
重新展示 by

这是在Clojure 1.12.0-alpha6的新统一限定方法语法中提供的。

而不是使用`(.a "")`,请使用类/成员语法。在这种情况下,`(String/.a "")`。这将编译(这表明Clojure编译器找到了匹配输入的唯一方法),或者将抛出一个语法异常(这表明它找到了0个匹配方法或多个匹配方法)。

通过仅使用此语法,你可以确保你总能匹配到具体的方法,而无需反射。

...