Macro when no Clojure


A macro when é uma estrutura de controle de fluxo que atua como um if contendo apenas o ramo “então” (then).

Diferente do if, o when permite múltiplas expressões em seu corpo sem a necessidade de um do explícito.

Valor de retorno:

  • Se a condição for verdadeira, avalia todas as expressões do corpo e retorna o valor da última.
  • Se a condição for falsa, o corpo é ignorado e o retorno é nil.

NOTE

O uso do when sinaliza explicitamente para quem lê o código que não existe (e não é necessária) uma alternativa “else” para aquele cenário.

Quando usar when e if

A escolha entre when e if depende da necessidade de um ramo alternativo e da quantidade de efeitos colaterais.

Uso de when

Ideal para validações, lançar exceções ou executar múltiplos efeitos colaterais (como logs) baseados em uma única condição positiva.

Exemplo de validação:

(when (neg? x)
  (println "Erro detectado!")
  (throw (RuntimeException. (str "x deve ser positivo: " x))))

Uso de if

No if, o código acima exigiria um do:

(if (neg? x)
  (do (println "Erro...")
      (throw ...))
  nil) ; else implícito ou explícito
 

Referências


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