SICP lisp'if'条件表达式解释

时间:2014-03-12 03:32:03

标签: if-statement scheme lisp conditional sicp

我正在通过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行是如何有效的。

3 个答案:

答案 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)))

澄清:guessx 条件的结果和替代,它们是表达式good-enough?过程的参数{ {1}},这只是条件部分。请记住,(good-enough? guess x)表达式的一般结构如下所示:

if

每个部分都是表达式。有关详细信息,请参阅documentation

答案 1 :(得分:3)

guessxgood-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