我在想,下面的代碼是如何評價這個計劃過程3.評估說明使用lambda表達式
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
我一直在尋找了一段時間,似乎無法理解爲什麼評價不會導致可以有人提供詳細的一步一步的指導如何評估3?
我在想,下面的代碼是如何評價這個計劃過程3.評估說明使用lambda表達式
(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
我一直在尋找了一段時間,似乎無法理解爲什麼評價不會導致可以有人提供詳細的一步一步的指導如何評估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
,其價值,被評估並丟棄。
哦,這是有道理的。謝謝 – MastRofDsastR