为什么Racket失去了单臂"if"?

soe*_*ard 29 racket

标准Scheme中,可以编写

(if (> x 2)
    (set! x (- x 1)))
Run Code Online (Sandbox Code Playgroud)

但这在Racket中是不可能的 - Racket if总是需要两个手臂.为什么?

soe*_*ard 48

合理

if从Racket中移除了单臂变种以防止错误.

在功能代码中,总是使用双臂变体if.

(if test expr-on-true expr-on-false)
Run Code Online (Sandbox Code Playgroud)

忘记第二臂expr-on-false不会导致语法错误,但会导致运行时错误(表达式将返回#<void>).

为了防止这些经常出现的功能代码中的错误,我们决定引入when单臂变体的形式if.

 (when test expr-on-true)
Run Code Online (Sandbox Code Playgroud)

除了防止意外错误之外,新形式向代码读​​者清楚地表明代码依赖于副作用.

将代码从标准方案移植到Racket

如果您尝试在Racket中运行Scheme代码并查看错误消息

if: bad syntax (must have an "else" expression)
Run Code Online (Sandbox Code Playgroud)

你必须将if表达式重写为whenunless.

只需重写:

(if test expr1)    to    (when test expr1)
Run Code Online (Sandbox Code Playgroud)

(if (not test) expr1)   to    (unless test expr1).
Run Code Online (Sandbox Code Playgroud)