Comment made by: cemerick
SS is correct about this approach not posing any issue for Maven. In addition, the build could easily be set up to always emit two jars, one "normal", one "debug".
I'd suggest that, while {{clojure.debug}} might have broad effect, additional properties should be available to provide fine-grained control over each of the additional "debug"-related parameterizations that might become available in the future.
I'd like to raise a couple of potentially tangential concerns (after now thinking about assertions for a bit in the above context), some or all of which may simply be a result of my lack of understanding in various areas.
Looking at where {{assert}} is used in {{core.clj}} (only two places AFAICT: validating arguments to {{derive}} and checking pre- and post-conditions in {{fn}}), it would seem unwise to make it {{false}} by default. i.e. non-{{Named}} values would be able to get into hierarchies, and pre- and post-conditions would simply be ignored.
It's my understanding that assertions (talking here of the JVM construct, from which Clojure reuses {{AssertionError}}) should not be used to validate arguments to public API functions, or used to validate any aspect of a function's normal operation (i.e. (link: http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#usage text: "where not to use assertions")). That would imply that {{derive}} should throw {{IllegalArugmentException}} when necessary, and fn pre- and post-conditions should perhaps throw {{IllegalStateException}} -- or, in any case, something other than {{AssertionError}} via {{assert}}. This would match up far better with most functions in core using {{assert-args}} rather than {{assert}}, the former throwing {{IllegalArgumentException}} rather than {{AssertionError}}.
That leads me to the question: is {{assert}} (and * }) intended to be a Clojure construct, or a quasi-interop form?
If the former, then it can roughly have whatever semantics we want, but then it seems like it should not be throwing {{AssertionError}}.
If the latter, then {{AssertionError}} is appropriate on the JVM, but then we need to take care that assertions can be enabled and disabled at runtime (without having to switch around different builds of Clojure), ideally using the host-defined switches (e.g. {{-ea}} and friends) and likely not anything like * . I don't know if this is possible or practical at this point (I presume this would require nontrivial compiler changes).
Hopefully the above is not water under the bridge at this point. Thank you in advance for your forbearance. ;-)