x 2) (set! x (- x 1))) 但这在 Racket 中是不可能的 -- Racket 的 if 总是需要两条 ARM 。-6ren">
gpt4 book ai didi

racket - 为什么 Racket 中缺少单臂 "if"?

转载 作者:行者123 更新时间:2023-12-03 09:20:37 25 4
gpt4 key购买 nike

standard Scheme可以写

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

但这在 Racket 中是不可能的 -- Racket 的 if 总是需要两条 ARM 。为什么?

最佳答案

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

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

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

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

为了防止函数代码中经常出现这些错误,我们决定引入 when 形式。对于 if 的单臂变体.
 (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 - 为什么 Racket 中缺少单臂 "if"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10863192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com