quando
No Scheme, embora if seja elegante e versátil, pode se tornar confuso quando usado sem um else explícito. Isto é particularmente verdadeiro quando a intenção é executar uma única ramificação do código apenas quando uma condição for verdadeira, sem nenhuma ação alternativa para o caso false. Nesses cenários, a construção when fornece uma alternativa mais clara e concisa.
A forma básica de when é assim:
(when test-is-true
do-this
do-that)- Se
testfor avaliado como verdadeiro (#t), todas as expressões no corpo da construçãowhenserão executadas sequencialmente. - Se
testfor avaliado como falso (#f), nada acontece e nenhum valor será retornado.
Exemplo
(when (< 0 1)
(lumi-message "Condition is true!")
(lumi-message "Executing additional actions."))Contrastando if e when
Para entender melhor a diferença entre if e when, considere o seguinte exemplo onde ambos são usados juntos:
(if (= 0 1)
(lumi-message "This will not run")
(when (< 0 1)
(lumi-message "The 'when' condition is true!")
(lumi-message "Executing multiple actions within 'when'.")))Explicação:
A condição
if:- O teste
(= 0 1)verifica se 0 é igual a 1. - Como isso é falso (
#f), o ramoelsedoifé executado.
- O teste
O Construto
whenna Filialelse:- O teste
when(< 0 1)verifica se 0 é menor que 1. - Como isso é verdade (
#t), todas as expressões dentro do corpo dowhensão executadas sequencialmente:- First, it prints
"The 'when' condition is true!". - Then, it prints
"Executing multiple actions within 'when'.".
- First, it prints
- O teste
Por que usar when aqui?
- Usar
whenem vez de outroifsimplifica a lógica quando não há necessidade de uma ramificaçãoelseexplícita para a condição. whendeixa claro que apenas o ramo verdadeiro é relevante, reduzindo possível confusão.
Resumo
- Use
ifquando precisar de uma ramificação verdadeira e falsa. - Use
whenquando houver apenas uma única ramificação para o caso verdadeiro, especialmente quando múltiplas ações precisarem ser executadas. - Combinar
ifewhenpode ajudar a estruturar condicionais mais complexas de forma clara e concisa.