使用 lambdas 对这个 Scheme 过程的评估的解释
Explanation of evaluation for this Scheme procedure using lambdas
我想知道以下代码如何计算为 3。
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
我已经看了一段时间,似乎无法理解为什么评估结果不是 9。有人可以提供有关如何评估为 3 的详细分步说明吗?
让我们先以更容易理解的方式缩进代码:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
y)))
现在让我们从内到外对其进行评估:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
3))) ; pass the parameter
(define (foo y)
((lambda (x) y)
(* 3 3))) ; evaluate innermost lambda
(define (foo y)
((lambda (x) y) 9)) ; pass the result of evaluation
啊哈!这就是我们得到 3
的地方。即使我们将 9
作为参数传递(绑定到 x
),我们只是返回最外层 y
参数的值,它一直是 3
:
=> 3
随着let
重写,
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
=
(let ([y 3]) ; by application
((lambda (x) y) ((lambda (y)(* y y)) y)))
=
(let ([y 3])
(let ([x ((lambda (y)(* y y)) y)]) ; by application
y ))
=
(let ([y 3])
(let ([x ((lambda (z)(* z z)) y)]) ; by alpha-renaming
y ))
=
(let ([y 3])
(let ([x (let ([z y]) ; by application
(* z z))])
y ))
=
(let ([y 3])
(let ([x (* y y)]) ; by let-elimination
y ))
=
(let ([y 3])
(let ([x 9]) ; by expression evaluation
y ))
=
(let ([y 3])
y ) ; by let-elimination
=
3 ; by let-elimination
正如你所看到的,嵌套的(lambda (y)(* y y))
位于嵌套范围内,不影响最终返回的y
,但只影响x
,其值,9,被评估然后被丢弃。
我想知道以下代码如何计算为 3。
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
我已经看了一段时间,似乎无法理解为什么评估结果不是 9。有人可以提供有关如何评估为 3 的详细分步说明吗?
让我们先以更容易理解的方式缩进代码:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
y)))
现在让我们从内到外对其进行评估:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
3))) ; pass the parameter
(define (foo y)
((lambda (x) y)
(* 3 3))) ; evaluate innermost lambda
(define (foo y)
((lambda (x) y) 9)) ; pass the result of evaluation
啊哈!这就是我们得到 3
的地方。即使我们将 9
作为参数传递(绑定到 x
),我们只是返回最外层 y
参数的值,它一直是 3
:
=> 3
随着let
重写,
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
=
(let ([y 3]) ; by application
((lambda (x) y) ((lambda (y)(* y y)) y)))
=
(let ([y 3])
(let ([x ((lambda (y)(* y y)) y)]) ; by application
y ))
=
(let ([y 3])
(let ([x ((lambda (z)(* z z)) y)]) ; by alpha-renaming
y ))
=
(let ([y 3])
(let ([x (let ([z y]) ; by application
(* z z))])
y ))
=
(let ([y 3])
(let ([x (* y y)]) ; by let-elimination
y ))
=
(let ([y 3])
(let ([x 9]) ; by expression evaluation
y ))
=
(let ([y 3])
y ) ; by let-elimination
=
3 ; by let-elimination
正如你所看到的,嵌套的(lambda (y)(* y y))
位于嵌套范围内,不影响最终返回的y
,但只影响x
,其值,9,被评估然后被丢弃。