Во-первых, можно требовать, чтобы в нем было предложение else, если вам будет проще. Во-вторых, Scheme поддерживает возврат нескольких значений из функции, поэтому, если бы вы реализовали возвращаемые значения в виде списка, у вас мог бы быть пустой список, означающий, что возвращаемое значение не было задано.
(if (has-alternative if-expr)
(eval (alternative if-expr)) ; make sure eval returns a list
'())
Важное различие здесь: я не возвращаю пустой список, если не было предложения else. Пустой список означает, что не было возвращаемого значения. Если бы было одно возвращаемое значение из выражения (скажем, это было 3), вы бы имели (3) как возвращение из eval за кулисами. Аналогично, возвращение нескольких значений из выражения приведет к тому, что в списке возврата eval будет несколько элементов.
Наконец, во всей практичности, вы могли бы действительно вернуть что угодно , если условие не выполнено и его больше нет, потому что в программе будет попытка получить значение функции, которая не ' ничего не вернуть. Таким образом, программистом, а не языком, будет отлавливать эту ошибку.