我正在通过SICP工作并参与了关于平方根代码的部分。我理解'if'语句只能跟随单个表达式。但是,在代码中,
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
我不明白当'guess'和'x'已被陈述为'if'的结果表达式时,第3,第4和第5行是如何有效的。
答案 0 :(得分:6)
在一些 Scheme解释器中,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?
过程的参数{ {1}},这只是条件部分。请记住,(good-enough? guess x)
表达式的一般结构如下所示:
if
每个部分都是表达式。有关详细信息,请参阅documentation。
答案 1 :(得分:3)
guess
和x
是good-enough?
谓词的参数," if
"正在以下guess
和(sqrt-iter ...)
表达式之间进行选择。
答案 2 :(得分:1)
不,在方案语言中,'if'语句后跟两个或三个表达式,而不仅仅是一个。
(if test-exp then-exp else-exp)
即使在某些方案解释器的实现中,'if'语句必须后跟三个表达式,'else-exp'也不能被省略。
更多细节阅读: http://classes.soe.ucsc.edu/cmps112/Spring03/languages/scheme/SchemeTutorialA.html#condexp