为啥 Racket 中缺少单臂“如果”?

Posted

技术标签:

【中文标题】为啥 Racket 中缺少单臂“如果”?【英文标题】:Why is one-armed "if" missing from Racket?为什么 Racket 中缺少单臂“如果”? 【发布时间】:2012-06-07 10:58:07 【问题描述】:

在standard Scheme可以写

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

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

【问题讨论】:

【参考方案1】:

基本原理

if 的单臂变体已从 Racket 中删除以防止出现错误。

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

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

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

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

 (when test expr-on-true)

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

将代码从标准 Scheme 移植到 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).

【讨论】:

以上是关于为啥 Racket 中缺少单臂“如果”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 URL 中缺少尾部斜杠 (/) 时会发生重定向?

为啥 LLVM 窗口中缺少 LLC.exe?

为啥我的 Wix 安装程序中缺少我的 CustomTable?

为啥 Oracle 认为我缺少右括号?

为啥android studio显示“约束布局中缺少约束”的错误?

为啥 Server 2008 的组策略管理中缺少远程桌面服务?