このような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
を使用します。ラムダはクロージャーなので、これはまったく問題ありません。x
はmake-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
機能に設けられた二つの引数のいずれかを生成します。
質問をしないでください。内容や質問を追加したい場合は、続けてください。あなたが答えを尋ねる場合は、コメント内でそれを行います。 –