在标准方案中,可以写
(if (> x 2)
(set! x (- x 1)))
但这在球拍中是不可能的——球拍if
总是需要两条手臂。为什么?
基本原理
单臂变种if
已从 Racket 中删除以防止出现错误。
在功能代码中,一个总是使用if
.
(if test expr-on-true expr-on-false)
忘记第二个手臂expr-on-false
不会导致语法错误,但会导致运行时错误(表达式将返回#<void>
)。
为了防止函数代码中经常出现这些错误,决定when
引入if
.
(when test expr-on-true)
除了防止意外错误之外,新形式还向代码读者清楚地表明,代码依赖于副作用。
将代码从标准 Scheme 移植到 Racket
如果您尝试在 Racket 中运行 Scheme 代码并看到错误消息
if: bad syntax (must have an "else" expression)
您必须将if
表达式重写为when
or unless
。
简单地重写:
(if test expr1) to (when test expr1)
和
(if (not test) expr1) to (unless test expr1).