Se
Nella sua forma più semplice, il condizionale if in Scheme valuta un test e, in base al risultato, esegue uno dei due possibili blocchi di codice. La forma più semplice è simile a questa:
(if test-is-true
do-this)- Se
testrestituisce true (#t), viene eseguito il blocco di codice nel conseguente. Il blocco può restituire un valore o eseguire altre azioni, come l’assegnazione di una variabile o la stampa dell’output.
Esempio
(if (< 0 1)
(lumi-message "True!"))- In questo caso,
testè(< 0 1)(controllando se 0 è inferiore a 1). - Poiché il test restituisce true (
#t), viene eseguito il blocco di codice(lumi-message "True!"), che stampa"True!".
Aggiunta di un’altra condizione: if-else
Quando si utilizza un condizionale if con un blocco di codice alternativo (il caso else), la struttura è simile alla seguente:
(if test
do-this
else-do-this)- Se
testrestituisce true (#t), viene eseguito il blocco di codice conseguente. - Se
testrestituisce false (#f), viene eseguito il blocco di codice alternativo.
(if test
consequent
alternative)Come funziona
Espressione di prova:
- L’espressione
testviene valutata per prima.
- L’espressione
Risultato basato sul test:
- Se
testrestituisce true (#t), viene eseguito il blocco di codice conseguente. - Se
testrestituisce false (#f), viene eseguito il blocco di codice alternativo.
- Se
Entrambi i blocchi di codice consequent e alternative possono eseguire qualsiasi operazione Scheme valida, inclusa la restituzione di valori, la modifica di variabili o l’esecuzione di procedure.
Esempi
Esempio 1: restituzione di un valore
(if (< 0 1)
1
0)- Qui,
testè(< 0 1)(controllando se 0 è inferiore a 1). - Poiché il test restituisce true (
#t), viene eseguito il blocco conseguente (1) e viene restituito il relativo valore.
Risultato: 1
Esempio 2: valutazione di un blocco iniziale
Nei casi in cui è necessario eseguire più azioni quando la condizione è vera o falsa, è possibile utilizzare begin o let per raggrupparle.
(if (= 0 1)
(begin
(lumi-message "This won't run")
1)
(begin
(lumi-message "False condition met, calculating...")
(* 3 4)))- In questo esempio,
testè(= 0 1)(controllando se 0 è uguale a 1). - Poiché il test restituisce falso (
#f), viene eseguito il blocco alternativo:- Innanzitutto, stampa
"False condition met, calculating...". - Quindi calcola
(* 3 4)e restituisce12.
- Innanzitutto, stampa
Risultato: Stampa “Falsa condizione soddisfatta, calcolo in corso…” e restituisce 12.
Esempio 3: valutazione di un’istruzione let
L’utilizzo di let ci consente di dichiarare variabili di ambito locale all’interno del blocco di codice.
(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 questo esempio,
testè(= 1 1)(controllando se 1 è uguale a 1). - Poiché il test restituisce true (
#t), viene eseguito il blocco conseguente:- Innanzitutto, stampa
"True condition met, calculating...". - Quindi calcola
(* -1 10)e restituisce-10.
- Innanzitutto, stampa
Risultato: Stampa “Vera condizione soddisfatta, calcolo in corso…” e restituisce -10.
Riepilogo- Il condizionale if è un potente strumento in Scheme per valutare i test ed eseguire i blocchi di codice corrispondenti.
- Può gestire sia espressioni semplici che blocchi di codice complessi che restituiscono valori, modificano variabili o eseguono effetti collaterali.
- Ricorda: se non è presente un blocco
elseesplicito,ifvaluta ed esegue il conseguente solo se il test è vero. Altrimenti valuta ed esegue l’alternativa.