if
In zijn eenvoudigste vorm evalueert het if-conditionele in Scheme een test en voert het, op basis van het resultaat, een van twee mogelijke codeblokken uit. De eenvoudigste vorm ziet er zo uit:
(if test-is-true
do-this)- Als de
testwaar (#t) evalueert, wordt het consequent-blok uitgevoerd. Het blok kan een waarde retourneren of andere acties uitvoeren, zoals een variabele toewijzen of output afdrukken.
Voorbeeld
(if (< 0 1)
(lumi-message "True!"))- In dit geval is de
test(< 0 1)(controle of 0 kleiner is dan 1). - Omdat de test waar (
#t) evalueert, wordt het codeblok(lumi-message "True!")uitgevoerd, dat"True!"afdrukt.
Een else-voorwaarde toevoegen: if-else
Wanneer een if-conditionele een alternatief codeblok heeft (het else-geval), ziet de structuur er zo uit:
(if test
do-this
else-do-this)- Als de
testwaar (#t) evalueert, wordt het consequent-codeblok uitgevoerd. - Als de
testonwaar (#f) evalueert, wordt het alternative-codeblok uitgevoerd.
(if test
consequent
alternative)Hoe het werkt
Testexpressie:
- De
test-expressie wordt eerst geëvalueerd.
- De
Resultaat op basis van de test:
- Als de
testwaar (#t) evalueert, wordt het consequent-codeblok uitgevoerd. - Als de
testonwaar (#f) evalueert, wordt het alternative-codeblok uitgevoerd.
- Als de
Zowel het consequent- als het alternative-codeblok kunnen elke geldige Scheme-bewerking uitvoeren, inclusief het retourneren van waarden, het wijzigen van variabelen of het uitvoeren van procedures.
Voorbeelden
Voorbeeld 1: een waarde retourneren
(if (< 0 1)
1
0)- Hier is de
test(< 0 1)(controle of 0 kleiner is dan 1). - Omdat de test waar (
#t) evalueert, wordt het consequent-blok (1) uitgevoerd en wordt de waarde ervan geretourneerd.
Resultaat: 1
Voorbeeld 2: een begin-blok evalueren
Als je meerdere acties moet uitvoeren wanneer de conditie waar of onwaar is, kun je begin of let gebruiken om ze te groeperen.
(if (= 0 1)
(begin
(lumi-message "This won't run")
1)
(begin
(lumi-message "False condition met, calculating...")
(* 3 4)))- In dit voorbeeld is de
test(= 0 1)(controle of 0 gelijk is aan 1). - Omdat de test onwaar (
#f) evalueert, wordt het alternative-blok uitgevoerd:- Eerst drukt het
"False condition met, calculating..."af. - Vervolgens berekent het
(* 3 4)en retourneert12.
- Eerst drukt het
Resultaat: Drukt “False condition met, calculating…” af en retourneert 12.
Voorbeeld 3: een let-expressie evalueren
Met let kun je lokale variabelen binnen het codeblok declareren.
(if (= 1 1)
(let (x -1)
(lumi-message "True condition met, calculating...")
(* x 10))
(let (y 4)
(lumi-message "This won't run")
(* 3 y)))- In dit voorbeeld is de
test(= 1 1)(controle of 1 gelijk is aan 1). - Omdat de test waar (
#t) evalueert, wordt het consequent-blok uitgevoerd:- Eerst drukt het
"True condition met, calculating..."af. - Vervolgens berekent het
(* -1 10)en retourneert-10.
- Eerst drukt het
Resultaat: Drukt “True condition met, calculating…” af en retourneert -10.
Samenvatting
- Het
if-conditionele is een krachtig hulpmiddel in Scheme voor het evalueren van tests en het uitvoeren van bijbehorende codeblokken. - Het kan zowel eenvoudige expressies als complexe codeblokken aan die waarden retourneren, variabelen wijzigen of neveneffecten uitvoeren.
- Onthoud: als er geen expliciet
else-blok is, evalueert en voertifalleen het consequent uit als de test waar is; anders het alternative.