So it turns out it is possible to have runtime disabled assertions in Clojure without a compiler change, but I don think it is possible to have assertions that can be disabled per package without a compiler change (if at all).
I have released a new library that allows you to globally enable/disable assertions at runtime in Clojure without any penalty. https://github.com/pjstadig/assertions Paul On Mon, Oct 14, 2013 at 2:37 PM, Paul Stadig <p...@stadig.name> wrote: > On Mon, Oct 14, 2013 at 5:59 AM, Phillip Lord < > phillip.l...@newcastle.ac.uk> wrote: > >> <lop...@gmail.com> writes: >> >> Same trick as >> Java -- optimise the check away at compile time. >> >> Indeed, this is how Clojure's assert works. >> > > This is the way Clojure's assert works (by compiling away the assertion). > This is not the way Java assertions work. Java assertions can be turned off > at runtime with zero performance penalty using a command line flag. The way > they work is: the body of the assert is made conditional on a static final > field of the class, the static initializer for said class will set that > static final field to true or false depending on the command line flag, at > runtime the JIT compiler notices that the static final field is set to > false and could never be set to true and it eliminates the body of the > assert as dead code. > > Java assertions are not compiled away by the Java compiler at compile > time. They are compiled away by the JIT compiler at runtime. > > Compiling assertions away at compile time isn't so bad, but there are two > problems: 1) it would be nice to be able to enable/disable assertions at > runtime like Java does, 2) there isn't actually a good way to tell the > compiler to turn assertions off. About the best you can do is set! *assert* > to false in your namespace, but this causes problems when the code is > AOT'ed or loaded in any context where *assert* does not have a binding > established. You could also alter-var-root *assert* in a user.clj file, > which also has problems (like the wholesale global disabling of asserts for > every namespace not to mention the non-composability of user.clj). > >> >> I think that you are worried about the overhead unnecessarily, though. >> The assert status is checked at macro expansion time. If per module >> switching on and off is what then I would suggest that you build on top >> of the existing assert. >> > > There is a huge performance penalty for Clojure assertions, if you don't > compile them away, and there isn't really an easy way to compile them away. > I know this because I wrote a persistent datastructure in Java and rewrote > it in Clojure comparing their performance (using assertions both times). It > was because of the performance penalty of Clojure's assertions that I wrote > the message to the clojure-dev mailing list (and also wrote my own assert > macro that I could toggle easily). > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.