when
W Scheme if jest elegancki i wszechstronny, ale bez jawnej gałęzi else może szybko wprowadzać w błąd — zwłaszcza gdy chcemy wykonać kod tylko wtedy, gdy warunek jest prawdziwy, bez alternatywy dla przypadku fałszywego. W takich sytuacjach konstrukcja when daje jaśniejszą i bardziej zwięzłą alternatywę.
Podstawowa postać when wygląda tak:
(when test-is-true
do-this
do-that)- Jeśli
testewaluuje się do prawdy (#t), wszystkie wyrażenia w cielewhensą wykonywane po kolei. - Jeśli
testewaluuje się do fałszu (#f), nic się nie dzieje i nie zwracana jest żadna wartość.
Przykład
(when (< 0 1)
(lumi-message "Condition is true!")
(lumi-message "Executing additional actions."))Porównanie if i when
Aby lepiej zrozumieć różnicę, rozważ przykład, w którym obie konstrukcje występują razem:
(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'.")))Wyjaśnienie
Warunek
if:- Test
(= 0 1)sprawdza, czy 0 równa się 1. - Ponieważ wynik to fałsz (
#f), wykonywana jest gałąźelse.
- Test
Konstrukcja
whenw gałęzielse:- Test
when(< 0 1)sprawdza, czy 0 jest mniejsze od 1. - Ponieważ wynik to prawda (
#t), wszystkie wyrażenia w cielewhensą wykonywane po kolei:- najpierw wypisuje
"The 'when' condition is true!", - następnie wypisuje
"Executing multiple actions within 'when'.".
- najpierw wypisuje
- Test
Dlaczego tu when?
- Zamiast kolejnego
ifbez sensownej gałęzielselogika jest prostsza. whenjasno pokazuje, że liczy się tylko przypadek prawdziwy, co redukuje zamieszanie.
Podsumowanie
- Używaj
if, gdy potrzebujesz zarówno gałęzi prawdziwej, jak i fałszywej. - Używaj
when, gdy istnieje tylko gałąź dla przypadku prawdziwego — zwłaszcza gdy trzeba wykonać wiele działań. - Łączenie
ifiwhenpomaga uporządkować bardziej złożone warunki w czytelny i zwięzły sposób.