cond
I Scheme används villkoret cond för att välja ett av flera möjliga kodblock att köra, baserat på flera test. Det liknar ett flergrenigt if, där varje gren kontrolleras i ordning tills en match hittas.
Syntax
(cond
(test-1 consequent-1)
(test-2 consequent-2)
...
(else fallback-consequent))- Varje test utvärderas i den ordning de skrivs.
- När ett test utvärderas till sant (
#t) körs motsvarande consequent ochcondslutar utvärdera fler test. - Klausulen
elseär valfri och fungerar som reserv om inget test är sant.
Så fungerar det
Testa varje villkor:
condutvärderar testen i listordning.
Kör matchande consequent:
- När det första testet som utvärderas till sant (
#t) hittas körs dess consequent. - Om inget test är sant och det finns
elsekörs fallback-consequent.
- När det första testet som utvärderas till sant (
Exempel
Exempel 1: consequent med enstaka uttryck
(cond
((< 3 2) "This won't run")
((= 3 3) "This will run")
(else "Fallback"))- Första testet
(< 3 2)utvärderas till falskt (#f). - Andra testet
(= 3 3)utvärderas till sant (#t), så"This will run"returneras. elsekörs inte eftersom en match redan hittades.
Resultat: “This will run”
Exempel 2: flera åtgärder med begin
När consequent innehåller flera åtgärder, gruppera dem med begin:
(cond
((< 5 3)
(begin
(lumi-message "This won't run")
(* 2 3)))
((> 5 3)
(begin
(lumi-message "Condition met")
(* 5 5)))
(else
(begin
(lumi-message "Fallback")
0)))- Första testet
(< 5 3)utvärderas till falskt (#f). - Andra testet
(> 5 3)utvärderas till sant (#t):- Det skriver ut
"Condition met". - Sedan beräknas
(* 5 5)och25returneras.
- Det skriver ut
Resultat: Skriver ut “Condition met” och returnerar 25.
Exempel 3: let-block i consequent
När du behöver lokala variabler, använd let:
(cond
;; Fall 1: om 0 är mindre än -1
((< 0 -1)
(let ((x 10))
(* x x)))
;; Fall 2: om 0 är större än -1
((> 0 -1)
(let ((y 20))
(lumi-message "Positive condition met")
(+ y y)))
;; Standardfall
(else
(let ((z 0))
z)))- Första testet
(< 0 -1)är falskt. - Andra testet
(> 0 -1)är sant, så:- Ett
let-block körs och binderytill20. - Det skriver ut
"Positive condition met". - Sedan beräknas
(+ y y)och40returneras.
- Ett
Resultat: Skriver ut “Positive condition met” och returnerar 40.
Exempel 4: reserv med else
(cond
((< 5 3) "This won't run")
((= 5 3) "This won't run either")
(else "Fallback value"))- Varken av de två första testen utvärderas till sant.
elsekörs och returnerar"Fallback value".
Resultat: “Fallback value”
Sammanfattning
- Använd
condför att hantera flera villkor på ett tydligt och koncist sätt. - Consequent kan vara enstaka uttryck eller grupperade åtgärder med
begin. - Använd
leti consequent för lokala variabler vid beräkningar. - Inkludera alltid
elsesom reserv för oväntade fall.
Denna flexibilitet gör cond till ett kraftfullt och läsbart verktyg för komplex förgreningslogik.