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

标签 lambda scheme racket

对于网站上给出的第一个示例: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/

相关文章:

c# - 为什么 c# 中的 lambda 似乎以不同方式处理 bool 返回值?

c++ - Lambda Capture by Value 强制所有作用域对象为 const

scheme - 什么是 Scheme 中的原子?

sorting - 定义一个过程,该过程将三个数字作为参数并返回两个较大数字的平方和

scheme - SICP - 哪些函数收敛于不动点?

lisp - "application: not a procedure"计算二项式

python - 如何在方案中像 python 一样追加?

java - instanceOf 和 () 强制转换与 lambda 内的 Class.isInstance 和 Class.cast 方法引用进行比较

java - 使用 Java lambda 而不是 'if else'

scheme - Racket中list和list*的区别