在标准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)