由 cemerick 发表的评论
SS关于此方法不会对Maven造成任何问题的说法是正确的。此外,配置构建以始终生成两个jar文件也是容易的,一个“正常”,一个“调试”。
我建议,虽然 {{clojure.debug}} 可能会有广泛的影响,但应该提供额外的属性以提供对每个将来可能出现的相关的“调试”参数化的细粒度控制。
在思考了上面的上下文中的断言之后,我想提出一些可能相关的担忧(我现在在各个领域对它们进行了思考),其中一些或所有可能仅仅是我在各个领域缺乏理解的结果。
查看在哪里使用 {{assert}} 于 {{core.clj}}(据我所知,只有两个地方:验证 {{derive}} 的参数和检查 {{fn}} 中的预条件和后条件),似乎不智将其设置为 {{false}}。也就是说,非 {{Named}} 值将能够进入层次结构,预条件和后条件将被简单地忽略。
据我所知,断言(这里指JVM的特性,Clojure重新使用了 {{AssertionError}})不应该用于验证公共API函数的参数,或用于验证函数的正常操作方面的任何方面(即(链接:http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#usage 文本:“where not to use assertions”)。这表明当必要时应抛出 {{IllegalArugmentException}} 的 {{derive}},fn 的预条件和后条件应可能抛出 {{IllegalStateException}} -- 或者无论如何,应该通过 {{assert}} 抛出其他而不是 {{AssertionError}}。这将与大多数在核心中使用 {{assert-args}} 而不是 {{assert}} 的函数相匹配,前者会抛出 {{IllegalArgumentException}} 而不是 {{AssertionError}}。
这让我产生了这样的疑问:{{assert}}(和 * })是否是Clojure结构,还是一种准互操作形式?
如果前者,则它可以大致具有我们想要的任何语义,但这似乎意味着它不应该抛出 {{AssertionError}}。
如果是后者,那么在JVM上使用{{AssertionError}}是合适的,但我们需要注意,断言可以在运行时被启用或禁用(而不必在不同的Clojure构建之间切换),理想情况下使用宿主定义的开关(例如{{-ea}}和相关命令)以及不太可能使用像 * 这样的东西。我不知道目前这个是否可能或可行(我认为这可能需要对编译器进行非平凡的修改)。
希望上述内容目前还不是过时的话题。提前感谢您的耐心。;-)