Expressão case no Clojure


A expressão case é utilizada para comparar um argumento contra uma série de valores literais em busca de uma correspondência exata.

  • Eficiência: Diferente do cond, que realiza uma busca linear , o case é executado em tempo constante .

  • Restrição de Literais: Para garantir essa performance, cada valor de teste deve ser um literal conhecido em tempo de compilação (números, strings, keywords, etc.). Não pode usar expressões ou funções no lado do teste.

Sintaxe:

(case valor-alvo
  valor-1 "resultado-1"
  valor-2 "resultado-2"
  "resultado-padrao-opcional")
 

Exemplo:

(defn test-case [x]
  (case x
    5  "É o número cinco"
    10 "É o número dez"
    "Não é 5 nem 10")) ; Este é o valor padrão (else)
 
(test-case 5)  ;; => "É o número cinco"
(test-case 11) ;; => "Não é 5 nem 10"
(defn test-case [x]
  (case x
    5  "É o número cinco"
    10 "É o número dez"))
 
(test-case 5)  ;; => "É o número cinco"
(test-case 11) ;; => Execution error (IllegalArgumentException) No matching clause: 11

Attention

Diferente do if ou cond (que retornam nil por padrão), o case lançará uma IllegalArgumentException se nenhum valor coincidir e nenhum “else” for fornecido.

Referências


https://clojure.org/guides/learn/flow#_case