32

标准方案中,可以写

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

但这在球拍中是不可能的——球拍if总是需要两条手臂。为什么?

4

1 回答 1

56

基本原理

单臂变种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表达式重写为whenor unless

简单地重写:

(if test expr1)    to    (when test expr1)

(if (not test) expr1)   to    (unless test expr1).
于 2012-06-02T14:37:57.193 回答