En primer lugar, que está bien si requiere tener una cláusula else, si se hace que sea más fácil para usted. En segundo lugar, Scheme admite devolver múltiples valores de una función, por lo que si implementara los valores de retorno como una lista, podría tener una lista vacía que indique que no se proporcionó ningún valor de retorno.
(if (has-alternative if-expr)
(eval (alternative if-expr)) ; make sure eval returns a list
'())
Una distinción importante aquí: No devolveré una lista vacía si no hubiera otra cláusula. La lista vacía significa que no hubo un valor de retorno. Si hubiera un valor de retorno de una expresión (digamos que era 3), usted tendría (3) como el retorno de la evaluación detrás de las escenas. Del mismo modo, devolver varios valores de una expresión haría que la lista de resultados eval tuviera múltiples elementos.
Finalmente, en realidad, podría devolver cualquier cosa si la condición falla y no hay más, porque sería un error en un programa intentar capturar el valor de una función que no devuelve nada . Como tal, sería el trabajo del programador, no el idioma, detectar este error.
Lo mismo es cierto también en R5RS. –
Prefiero #f ya que (si '() ...) dará la rama #t (¿tiene que probar con nulo?). – Jyaan