Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java's switch equivalent in Clojure?

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?

like image 823
vikbehal Avatar asked Dec 02 '11 06:12

vikbehal


3 Answers

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]

like image 103
mikera Avatar answered Oct 16 '22 04:10

mikera


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.

like image 39
Jan Avatar answered Oct 16 '22 04:10

Jan


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.

like image 8
omiel Avatar answered Oct 16 '22 04:10

omiel