Is there an equivalent for Java's switch
construct in Clojure? If yes, what is it? If no, do we have to use if
else
ladder to achieve it?
case is a good option as pointed out by Jan
cond is also very useful in many related circumstances, particularly if you want to switch on the basis of evaluating a range of different conditional expressions, e.g.
(defn account-message [balance]
(cond
(< balance 0) "Overdrawn!"
(< balance 100) "Low balance"
(> balance 1000000) "Rich as creosote"
:else "Good balance"))
Note that the result of cond is determined by the first matching expression, so a negative balance will display "Overdrawn!" even though it also matches the low balance case.
[I have edited the code - removed the extra bracket at the end to make it work]
Try the case
macro:
(case (+ 2 3)
6 "error"
5 "ok")
or with default value
(case (+ 2 3)
5 "ok"
"error")
Remember that according to the documentation
The test-constants are not evaluated. They must be compile-time literals, and need not be quoted. (...)
See more examples at ClojureDocs.
Though @Jan and @mikera suggestions to use case
or cond
(may I add condp
to the list?) are sound from a functional¹ standpoint and though case
's limitations (e.g. test values can only be compile-time constants ; a default return value is mandatory) mirror those of switch
there are some subtle differences:
case
cannot be used with Java Enum
constants ;
case
's dispatch is based on hashing AFAIK which makes it comparable to hashmaps in terms of performance ; switch
is way faster ;
you cannot fall-through with case
, which means that you must use other options (condp
with value sets ?) to mirror switch
's behaviour.
[¹] not functional as in functional-programming, functional as in fulfilling a function, serving a purpose.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With