2016-11-20 43 views
1

默認情況下,球拍內置了一個make-posn。這是一個lambda實現。Posn in scheme/DrRacket

(define (my-make-posn x y) 
    (lambda (s) 
    (cond [(symbol=? s 'x) x] 
      [(symbol=? s 'y) y])) 

但這返回(lambda (a1) ...)當我嘗試(my-make-posn 3 2)

這是爲什麼?

我不明白lambda在這裏是如何使用的?

我們鍵入(my-make-posn 3 2)和函數體是:

(lambda (s) 
    (cond [(symbol=? s 'x) x] 
     [(symbol=? s 'y) y])) 

那麼會發生什麼情況(3, 2)

+0

請不要破壞你的問題 - 如果你想添加更多的內容或其他問題,繼續。如果您想查詢答案,請在評論中填寫。 –

回答

0

你打電話給my-make-posn錯了;你應該通過符號來訪問約束變量來代替:

> ((my-make-posn 3 2) 'x) 
3 
> ((my-make-posn 3 2) 'y) 
2 

拉姆達被用於有條件地返回xy

0

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函數的兩個參數之一。