为什么这是输出?
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
希望这个解法能看懂
我一直在做一些研究,我遇到了这段代码:
(((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
希望这个解法能看懂