Po pierwsze, to OK, jeśli wymagać, aby mieć klauzulę innego, jeśli to sprawia, że łatwiejsze. Po drugie, Schemat obsługuje zwracanie wielu wartości z funkcji, więc jeśli zaimplementujesz zwracane wartości jako listę, możesz mieć pustą listę oznaczającą, że nie podano żadnej wartości zwracanej.
(if (has-alternative if-expr)
(eval (alternative if-expr)) ; make sure eval returns a list
'())
Ważne rozróżnienie tutaj: Nie zwracam pustej listy, jeśli nie ma innej klauzuli. Pusta lista oznacza, że nie było żadnej wartości zwracanej. Jeśli była jedna wartość zwracana z wyrażenia (powiedzmy, że było 3), to miałbyś (3) jako powrót z eval za kulisami. Podobnie, zwracanie wielu wartości z wyrażenia spowoduje, że lista zwrotów eval będzie zawierała wiele elementów.
Na koniec, praktycznie można zwrócić dowolną wartość, jeśli warunek nie powiedzie się i nie ma innego, ponieważ błąd w programie próbowałby przechwycić wartość funkcji, która nie zwraca niczego . W związku z tym zadaniem tego programisty, a nie języka, byłoby złapanie tego błędu.
To samo dotyczy również R5RS. –
Preferuję #f od (jeśli '() ...) da gałąź #t (trzeba przetestować z wartością null?). – Jyaan