为什么这是输出?

Why is this the output?

我一直在做一些研究,我遇到了这段代码:

(((lambda (y)
     (lambda (z) (+ z (- 2 y)))) 3) 5)

此代码的输出是 4,但我不确定为什么。我看到 3 分配给 'y',5 分配给 'z',但我不明白为什么。

我原以为 3 会先分配给 'z',然后 5 分配给 'y',但事实恰恰相反。 scheme/racket 采取哪些步骤来做到这一点?

你的回答是正确的。最明确的理由是对表达式进行逐步评估:

1.将值替换为 y

((lambda (z)
   (+ z (- 2 3)))
 5)

2。将值替换为 z

(+ 5 (- 2 3))

3。确定+

的第2个参数的值
(+ 5 -1)

4.需要的值在这里。

4

首先我们应该了解lambda结构。如果你往下看

( ( lambda (var ...) body1 body2 ...) 表达式 ...)

例如((lambda (y) (* y y) 3)==> 3 assing to y. then (* 3 3)==>9

如果你往下看

(  >((lambda (y)
       (lambda (z) (+ z (- 2 y))))  3)<   ....)

3 分配给 y。

Then >(  ((lambda (y)
           (lambda (z) (+ z (- 2 y))))  3)   5)<

5 分配给 z

希望这个解法能看懂