使用 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,被评估然后被丢弃。