Scheme中的正常顺序和应用顺序评估

时间:2010-06-22 15:38:26

标签: lambda scheme racket

对于网站上提供的第一个示例:View-Site,我的理解是正常顺序评估为[6;1;1],而应用顺序评估为[6;2;2]

有人可以确认我的评估吗?

的问候,
darkie

1 个答案:

答案 0 :(得分:3)

好的,让我们通过正常评估评估(cons res v)的步骤:

v已被定义为(cons a (cons b ’())),因此我们有cons res (cons a (cons b ’()))res定义为(foo ...),因此我们有

(cons (foo (begin (set! a (+ a 1)) a)
           (begin (set! b (* b 2)) b))
      (cons a (cons b ’())))

最后foo x y被定义为(+ x y y),因此将(begin (set! a (+ a 1)) a)替换为x而将(begin (set! b (* b 2)) b)替换为y,我们得到:

(cons (+ (begin (set! a (+ a 1)) a)
         (begin (set! b (* b 2)) b)
         (begin (set! b (* b 2)) b))
      (cons a (cons b ’())))

现在让我们评估一下:为了得到缺点的结果,我们首先需要评估它的第一个参数(+ ...)。所以我们首先需要评估+的第一个参数(begin (set! a (+ a 1)) a)。这个求值为2,因此a的值现在为2,而+的第一个参数也是2.现在我们对第二个参数做同样的事情。这也计算为2并将b设置为2.第三个参数再次为(begin (set! b (* b 2)) b),因此b的值现在为4,第三个参数为4.因此{{1}的第一个参数}是结果cons,为8,(+ 2 2 4)a的值为2和4。

现在我们需要评估第二个参数b。因此,(cons a (cons b ’()))a的值为2和4,最终结果为b