Ответ 1
Обоснование
Одноразовый вариант if
был удален из Racket для предотвращения ошибок.
В функциональном коде всегда используется двухрукий вариант if
.
(if test expr-on-true expr-on-false)
Забытие второго плеча expr-on-false
не приведет к синтаксической ошибке, а к ошибке выполнения (выражение вернет #<void>
).
Чтобы предотвратить появление этих часто встречающихся ошибок в функциональном коде, было принято решение ввести форму when
для однорукого варианта if
.
(when test expr-on-true)
Помимо предотвращения случайных ошибок, новая форма четко указывает читателю кода, что код зависит от побочных эффектов.
Портирование кода из стандартной схемы в Racket
Если вы попытаетесь запустить код схемы в Racket и увидите сообщение об ошибке
if: bad syntax (must have an "else" expression)
вы должны переписать выражение if
на when
или unless
.
Просто перепишите:
(if test expr1) to (when test expr1)
и
(if (not test) expr1) to (unless test expr1).