Expressão cond no Clojure


A expressão cond (abreviação de conditional) é utilizada para avaliar uma série de testes lógicos, permitindo tratar múltiplas ramificações de forma mais organizada do que o aninhamento manual de múltiplos if.

O cond recebe uma sequência de pares, onde o primeiro elemento é um teste e o segundo é a expressão a ser executada caso o teste seja verdadeiro.

Os testes são processados na ordem em que foram escritos. A primeira expressão cujo teste resultar em um valor verdadeiro é avaliada e seu resultado é retornado.

(defn categorizar [n]
  (cond
    (< n 0)   "Negativo"    ; Par 1: Teste -> Expressão
    (< n 10)  "Pequeno"     ; Par 2: Teste -> Expressão
    (< n 100) "Médio"       ; Par 3: Teste -> Expressão
    :else     "Grande"))    ; Par 4: Default (sempre true)
 
(categorizar 5)   ;; => "Pequeno"
(categorizar 50)  ;; => "Médio"
(categorizar -1)  ;; => "Negativo"

Retorno Padrão: Se nenhum dos testes for satisfeito, o cond retorna nil.

(let [idade 15]
  (cond
    (>= idade 18) "Adulto"
    (>= idade 65) "Idoso")) 
    
;; => nil (15 não é >= 18 nem >= 65)

Avaliação de curto-circuito

Uma vez que um teste é satisfeito, nenhum dos testes subsequentes é avaliado.

(let [x 5]
  (cond
    (= x 5) "Encontrou o 5!"
    (do (println "Isso nunca será impresso") (= x 5)) "Ainda é 5"
    :else "Nada"))
    
;; => "Encontrou o 5!"

NOTE

O console ficará limpo, pois o segundo teste nunca foi executado.

Referências


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