if
W najprostszej postaci warunek if w Scheme ewaluuje test i na podstawie wyniku wykonuje jeden z dwóch możliwych bloków kodu. Najprostsza postać wygląda tak:
(if test-is-true
do-this)- Jeśli
testewaluuje się do prawdy (#t), wykonywany jest blok consequent. Blok może zwracać wartość lub wykonywać inne działania, takie jak przypisanie zmiennej lub wypisanie wyniku.
Przykład
(if (< 0 1)
(lumi-message "True!"))- W tym przypadku
testto(< 0 1)(sprawdzenie, czy 0 jest mniejsze od 1). - Ponieważ test ewaluuje się do prawdy (
#t), wykonywany jest blok kodu(lumi-message "True!"), który wypisuje"True!".
Dodawanie warunku else: if-else
Gdy warunek if ma alternatywny blok kodu (przypadek else), struktura wygląda tak:
(if test
do-this
else-do-this)- Jeśli
testewaluuje się do prawdy (#t), wykonywany jest blok consequent. - Jeśli
testewaluuje się do fałszu (#f), wykonywany jest blok alternative.
(if test
consequent
alternative)Jak to działa
Wyrażenie testowe:
- Najpierw ewaluowany jest
test.
- Najpierw ewaluowany jest
Wynik w zależności od testu:
- Jeśli
testewaluuje się do prawdy (#t), wykonywany jest blok consequent. - Jeśli
testewaluuje się do fałszu (#f), wykonywany jest blok alternative.
- Jeśli
Zarówno bloki consequent, jak i alternative mogą wykonywać dowolne poprawne operacje Scheme, w tym zwracać wartości, modyfikować zmienne lub uruchamiać procedury.
Przykłady
Przykład 1: zwracanie wartości
(if (< 0 1)
1
0)- Tutaj
testto(< 0 1)(sprawdzenie, czy 0 jest mniejsze od 1). - Ponieważ test ewaluuje się do prawdy (
#t), wykonywany jest blok consequent (1) i zwracana jest jego wartość.
Wynik: 1
Przykład 2: ewaluacja bloku begin
Gdy trzeba wykonać wiele działań, gdy warunek jest prawdziwy lub fałszywy, można użyć begin lub let, aby je pogrupować.
(if (= 0 1)
(begin
(lumi-message "This won't run")
1)
(begin
(lumi-message "False condition met, calculating...")
(* 3 4)))- W tym przykładzie
testto(= 0 1)(sprawdzenie, czy 0 równa się 1). - Ponieważ test ewaluuje się do fałszu (
#f), wykonywany jest blok alternative:- Najpierw wypisuje
"False condition met, calculating...". - Następnie oblicza
(* 3 4)i zwraca12.
- Najpierw wypisuje
Wynik: Wypisuje “False condition met, calculating…” i zwraca 12.
Przykład 3: ewaluacja wyrażenia let
Użycie let pozwala zadeklarować zmienne lokalne w bloku kodu.
(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)))- W tym przykładzie
testto(= 1 1)(sprawdzenie, czy 1 równa się 1). - Ponieważ test ewaluuje się do prawdy (
#t), wykonywany jest blok consequent:- Najpierw wypisuje
"True condition met, calculating...". - Następnie oblicza
(* -1 10)i zwraca-10.
- Najpierw wypisuje
Wynik: Wypisuje “True condition met, calculating…” i zwraca -10.
Podsumowanie
- Warunek
ifto potężne narzędzie w Scheme do ewaluacji testów i wykonywania odpowiednich bloków kodu. - Obsługuje zarówno proste wyrażenia, jak i złożone bloki kodu zwracające wartości, modyfikujące zmienne lub wykonujące efekty uboczne.
- Pamiętaj: jeśli nie ma jawnego bloku
else,ifewaluuje i wykonuje consequent tylko wtedy, gdy test jest prawdziwy; w przeciwnym razie alternative.