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
whensinaliza 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