2016-11-20 13 views
1

デフォルトでラケットに組み込まれているmake-posnがあります。ここにラムダを使った実装があります。計画/ DrRacketの位置

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

しかし、私は(my-make-posn 3 2)をしようとしたとき、これは(lambda (a1) ...)を返します。

なぜこのようなのですか?

ラムダの使用方法はありませんか?

我々は(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 

ラムダは条件付きでxまたはyを返すために使用されています。

0

このようなposnの「エンコード」は、ラムダがの字句クロージャであるという事実を利用しています。これは、ローカルバインディングであっても、定義されているスコープ内の値にラムダがアクセスできることを意味します。たとえば、ラムダを返す関数を簡単に使用する場合を考えてみましょう。

(define (make-adder x) 
    (lambda (y) (+ x y))) 

これは関数を返す関数です。結果の関数は引数を1つとります。あなたはそれがこのように使われているかを確認することができます

> (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の定義を考えてみましょう。内側ラムダは、make-adder関数の引数であるxを使用します。ラムダはクロージャーなので、これはまったく問題ありません。xmake-adderに与えられた値に事実上「ロック」されます。つまり、xは内側のラムダによって「閉じられている」ため、その名前になります。

こののより具体的な例について、あなたは代替の一種として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機能に設けられた二つの引数のいずれかを生成します。