posn的這種「編碼」利用了lambda是詞彙關閉的事實。這意味着lambda可以訪問定義範圍內的值,即使它們是本地綁定。例如,考慮這個簡單的使用,它返回一個lambda函數:
(define (make-adder x)
(lambda (y) (+ x y)))
這是一個返回函數的函數。結果函數帶有一個參數。你可以看到它是如何使用這樣的:
> (define add1 (make-adder 1))
> (add1 1)
2
> (add1 2)
3
> (define add2 (make-adder 2))
> (add2 1)
3
> (add2 2)
4
由於功能只是普通的值,也可以直接使用生成的功能,不綁定到一個變量名:
> ((make-adder 10) 5)
15
如何做到這一點工作?那麼考慮一下make-adder
的定義。內部lambda使用x
,這是make-adder
函數的參數。由於lambda是關閉,這是完全正常的,並且x
實際上變爲「鎖定」到提供給make-adder
的值;也就是x
被內部lambda「封閉」,因此名稱。
對於這個更具體的例子,你能想象評估make-adder
作爲一種替代的:
1. (make-adder 1) ; given
2. ((lambda (x) ; substitution of the
(lambda (y) ; definition of make-adder
(+ x y)))
1)
3. (lambda (y) ; lambda reduction, substituting
(+ 1 y)) ; 1 for x within the body
同樣的事情正被用於my-make-posn
。我們可以做同樣的擴張爲(my-make-posn 3 2)
:
1. (my-make-posn 3 2) ; given
2. ((lambda (x y) ; substitution of the
(lambda (s) ; definition of my-make-posn
(cond [(symbol=? s 'x) x]
[(symbol=? s 'y) y])))
3 2)
3. (lambda (s) ; lambda reduction, substituting
(cond [(symbol=? s 'x) 3] ; 3 for x and 2 for y within the body
[(symbol=? s 'y) 2]))
因此,結果是一個函數,它的象徵,無論是'x
或'y
,併產生提供給原始my-make-posn
函數的兩個參數之一。
請不要破壞你的問題 - 如果你想添加更多的內容或其他問題,繼續。如果您想查詢答案,請在評論中填寫。 –