在标准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表达式重写为when或unless.
只需重写:
(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)