对于网站上给出的第一个示例:View-Site ,我的理解是正常订单评估为 [6;1;1]
并且应用顺序计算为 [6;2;2]
任何人都可以确认我的评估吗?
问候,
黑鬼
最佳答案
好的,让我们完成评估 (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 ’())))
所以现在让我们评估一下:为了得到 cons 的结果,我们首先需要评估它的第一个参数,
(+ ...)
.所以我们首先需要评估 +
的第一个参数这是 (begin (set! a (+ a 1)) a)
.计算结果为 2,因此 a
的值现在是 2 并且是 +
的第一个参数也是 2。现在我们对第二个参数做同样的事情。这也计算为 2 并将 b 设置为 2。第三个参数是 (begin (set! b (* b 2)) b)
再次,所以 b
的值现在是 4,第三个参数是 4。所以第一个参数 cons
结果是(+ 2 2 4)
,即 8 和 a
的值和 b
是 2 和 4。现在我们需要评估第二个参数,
(cons a (cons b ’()))
.所以由于a
的值和 b
是 2 和 4,最终结果是 (8 2 4)
.
关于lambda - Scheme中的正常顺序和应用顺序评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094699/