när
I Scheme, medan if är elegant och mångsidig, kan det bli förvirrande när det används utan ett uttryckligt else. Detta är särskilt sant när avsikten är att exekvera en enda kodgren endast när ett villkor är sant, utan någon alternativ åtgärd för false-fallet. I sådana scenarier ger when konstruktionen ett tydligare och mer kortfattat alternativ.
Den grundläggande formen av when ser ut så här:
(when test-is-true
do-this
do-that)- Om
testevalueras till sant (#t), exekveras alla uttryck i kroppen avwhenkonstruktionen sekventiellt. - Om
testutvärderas till falskt (#f), händer ingenting och inga värden returneras.
Exempel
(when (< 0 1)
(lumi-message "Condition is true!")
(lumi-message "Executing additional actions."))Kontrasterande if och when
För att bättre förstå skillnaden mellan if och when, överväg följande exempel där båda används tillsammans:
(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'.")))Förklaring:
iftillstånd:- Testet
(= 0 1)kontrollerar om 0 är lika med 1. - Eftersom detta är falskt (
#f), exekveraselse-grenen avif.
- Testet
when-konstruktionen ielse-grenen:when-testet(< 0 1)kontrollerar om 0 är mindre än 1.- Eftersom detta är sant (
#t), exekveras alla uttryck i kroppen avwhensekventiellt:- First, it prints
"The 'when' condition is true!". - Then, it prints
"Executing multiple actions within 'when'.".
- First, it prints
Varför använda when här?
- Att använda
whenistället för en annanifförenklar logiken när det inte finns något behov av en explicitelse-gren för villkoret. whengör det klart att endast den sanna grenen är relevant, vilket minskar potentiell förvirring.
Sammanfattning
- Använd
ifnär du behöver både en sann och falsk gren. - Använd
whennär det bara finns en enda gren för det sanna fallet, speciellt när flera åtgärder måste utföras. - Att kombinera
ifochwhenkan hjälpa till att strukturera mer komplexa villkor tydligt och koncist.