Подтвердить что ты не робот

Почему однорукий "если" отсутствует в Racket?

В стандартная схема можно написать

(if (> x 2)
    (set! x (- x 1)))

но это невозможно в Racket - Racket if всегда требуется два оружия. Почему?

4b9b3361

Ответ 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).