scheme - 方案解释器不允许没有替代子句的 if 语句是标准吗?

标签 scheme sicp

我是Scheme新手,我的背景编码主要是C++/Java,还有一点Python。我正在做计算机程序的研究和解释练习,我遇到了这个问题:

书中详细介绍了“if”特殊形式的结构为(if(条件)(结果子句)(选择子句))。然而,没有任何迹象表明必须包含替代条款。

事实上,在我目前正在进行的练习中(练习 1.22,对于任何感兴趣的人),他们提供了一些代码,我们应该使用这些代码来创建一个过程,该过程测试给定范围内的素数并给出找到它们所花费的时间。

(define (start-prime-test n start-time)
    (if (is-prime n)
        (report-prime (- (runtime) start-time))))

这不起作用,所以我稍微修改了一下:

(define (start-prime-test n start-time)
    (if (is-prime n)
        (report-prime (- (runtime) start-time))
        (display ""))) ;prints nothing

第一个版本导致“SchemeError:操作数太少...”,我将其修改为具有基本上不执行任何操作的替代子句,并且在测试过程时不再收到错误。

我只是想知道要求替代子句对于大多数方案解释器来说是否是标准的,或者它对于我正在使用的解释器来说是否是唯一的。我目前使用两种不同的解释器,因为我使用的第一个解释器不包括书中详细介绍的内置程序,所以我注意到Scheme解释器存在一些重大差异。但据我所知,通过谷歌搜索很难找到有用的信息。

任何帮助将不胜感激;我不喜欢包含“什么都不做”的程序。

最佳答案

在大多数Scheme解释器中if允许没有“else”部分的表达式,这就是 standard 的内容。正如 @codybartfast 在他的回答中指出的那样。

我只知道 Racket 强制执行以下规则:if 必须始终同时具有结果部分和替代部分,这是有充分理由的:它将帮助您发现此类错误当你忘记写“else”部分时就会发生这种情况。

虽然没有替代部分的 if 表达式是有效的,但只有当我们编写过程代码时才会发生这种情况(例如在示例中显示结果),而这正是我们想要的编程风格使用Scheme时避免(因为我们喜欢函数式编程)。

话虽如此,如果您绝对确定要编写过程代码,那么您应该使用 when,它没有 else 部分,并且与 if 不同,它内部可以有多个表达式,因为它有一个隐式的 begin。这将起作用:

(define (start-prime-test n start-time)
  (when (is-prime n)
    (report-prime (- (runtime) start-time))))

关于scheme - 方案解释器不允许没有替代子句的 if 语句是标准吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56142954/

相关文章:

loops - 为什么 Scheme 没有循环?

list - 如何在 Racket (方案)中将列表分成均匀大小的 block ?

scheme - 在 Racket 中如何匹配?

lisp - SICP Section 3.4中mutex的实现

macros - 在宏定义中混淆

scheme - 评估组合以递归处理 (+ 1 2)

scheme - 通过计划中的值(value)混淆

scheme - 我如何在 DrRacket 加载我的文件

scheme - 麻省理工学院计划中值程序

lisp - 关于SICP chpt 4.1 : How does (analyze expr) help speed up eval?的问题