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