首页 > 解决方案 > SICP 打算如何使用没有替代 (else) 部分的 (if) 表格?

问题描述

SICP 的练习 1.22包含以下过程:

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

在我看来,if表单没有替代分支。我只能看到if (test) (consequent)。SICP在哪里引入这个表格?if第 1.1.6 节中进行了介绍,但我在该节中看不到涵盖“if没有else”情况的任何地方。我有可能从cond同一部分的定义中猜出预期的行为,但该部分有一个脚注,表明两者是不同的。那么我怎样才能知道 SICP 打算如何使用这些if表格呢?

标签: if-statementschemesicp

解决方案


在查阅了索引后,我发现有两个地方定义了它:3.3 节的脚注 29和 4.1 节的脚注 10。引用两者:

观察此过程中的 if 表达式没有 <alternative> 表达式。这种“单臂 if 语句”用于决定是否做某事,而不是在两个表达式之间进行选择。如果谓词为假且不存在 < 替代 >,则 if 表达式返回未指定的值。

Scheme中未指定谓词为假且没有替代方案时的if表达式的值;我们在这里选择了 [在 The Metacircular Evaluator 中] 使其为假。我们将通过在全局环境中绑定它们来支持在表达式中使用变量 true 和 false 来评估它们。请参阅第 4.1.4 节。

我承认在咨询 Stack Overflow 之前我应该​​考虑咨询索引。显然,互联网已经腐烂了我的大脑。但是,我希望这个问题有比我在这里给出的更好的答案。“它是在你需要它之​​后定义的两章”,即使正确,也不是很愉快。

从好的方面来说,codybartfast 的评论正确地指出你不需要理解练习 1.22 中描述的过程来解决这个问题。事实上,我自己解决了这个问题,很明显我想得太多了。不到五行就可以解决。此外,还有人指出,虽然它的前几个词恰好符合 Scheme 的标准,但上面的第二个引用主要是在谈论第 4 章中正在构建的实现,而不是任何预期使用或在前面的章节中理解。


推荐阅读