Problem
It is pretty obscure how to get constant-time dispatch for e.g. Enums, even if user knows about case.
Proposal
The possibility to dispatch to arbitrary constants with case, by wrapper macro, should be documented.
Wording
- Should it warn against doing that with unstable values?
- Should it mention anything else than java Enums?
Case Techniques
Case is documented for accepting all readable forms as test-constants. However, it can also be made to use any compile-time-known constants as test-constants, by wrapping it in another macro.
Sometimes this is appropriate, e.g. when dispatching on a java Enum.
Other times, less so, e.g. when dispatching on objects whose hash changes when the vm is restarted (breaks AOT).
Implications
This technique is an application of a more general technique: Passing non-literals to a macro from another macro.
Are there other macros that have use cases like this?
References
https://groups.google.com/d/topic/clojure/3yGjDO2YnjQ/discussion