为什么Racket失去了单臂“if”?

时间:2012-06-02 14:37:57

标签: racket

standard Scheme中可以写

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

但这在Racket中是不可能的 - 球拍if总是需要两只手臂。为什么呢?

1 个答案:

答案 0 :(得分:46)

<强>原理

从Racket中删除了if的单臂变种以防止错误。

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

(if test expr-on-true expr-on-false)

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

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

 (when test expr-on-true)

除了防止意外错误之外,新表格还向代码读者清楚地表明代码依赖于副作用。

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

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

if: bad syntax (must have an "else" expression)

您必须将if表达式重写为whenunless

简单地改写:

(if test expr1)    to    (when test expr1)

(if (not test) expr1)   to    (unless test expr1).