我正在通过 SICP 工作,并且已经了解了有关平方根代码的部分。我知道"如果"语句后面只能跟着单个表达式。但是,在代码中,
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
我不明白当"猜测"和"x"已经陈述为"if"的后续表达式时,第 3、4 和 5 行如何有效。
在某些方案解释器中,一个if
特殊形式可以在条件后跟一个或两个表达式,在其他(例如:Racket(中,条件后面必须跟两个表达式。但是在你的代码中,条件后面有两个表达式!这更像是一个缩进问题,请参阅:
(define (sqrt-iter guess x)
(if (good-enough? guess x) ; condition
guess ; first expression (consequent)
(sqrt-iter (improve guess x) ; second expression (alternative)
x)))
澄清一下:guess
和x
不是条件的结果和替代,它们是表达式(good-enough? guess x)
中good-enough?
过程的参数,这只是条件部分。 请记住,if
表达式的一般结构如下所示:
(if <condition>
<consequent>
<alternative>)
其中每个部分都是一个表达式。有关更多详细信息,请参阅文档。
guess
和x
是good-enough?
谓词的参数,"if
"在以下guess
和(sqrt-iter ...)
表达式之间进行选择。
不,在方案语言中,"if"语句可以后跟两个或三个表达式,而不仅仅是一个表达式。
(if test-exp then-exp else-exp)
即使在方案解释器的某些实现中,"if"语句必须后跟三个表达式,也不能省略"else-exp"。
更多详情请阅读:http://classes.soe.ucsc.edu/cmps112/Spring03/languages/scheme/SchemeTutorialA.html#condexp