Clojure

Document usage for case with non-readable constants

Details

  • Type: Enhancement Enhancement
  • Status: Reopened Reopened
  • Priority: Minor Minor
  • Resolution: Unresolved
  • Affects Version/s: None
  • Fix Version/s: None
  • Component/s: None
  • Labels:

Description

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

Activity

Hide
Herwig Hochleitner added a comment - - edited

This is a duplicate of http://dev.clojure.org/jira/browse/CLJ-1367

Actually, it's an alternate solution

Show
Herwig Hochleitner added a comment - - edited This is a duplicate of http://dev.clojure.org/jira/browse/CLJ-1367 Actually, it's an alternate solution
Hide
Petr Gladkikh added a comment -

Probably this ticket and CLJ-1367 linger for so long because there's already 'condp' that can be used as follows:

(condp = test-value
  JavaClass/CONST1 result1
  JavaClass/CONST2 result2)

This is sequential and slower but is about as concise as plain case.

However if this is the form to be used instead of plain 'case' this should be suggested by documentation.

Show
Petr Gladkikh added a comment - Probably this ticket and CLJ-1367 linger for so long because there's already 'condp' that can be used as follows:
(condp = test-value
  JavaClass/CONST1 result1
  JavaClass/CONST2 result2)
This is sequential and slower but is about as concise as plain case. However if this is the form to be used instead of plain 'case' this should be suggested by documentation.

People

Vote (0)
Watch (3)

Dates

  • Created:
    Updated: