1
  1. (define self-add
    (let ((x 0))
      (lambda ()
        (set! x (+ x 1))
        x)))
    

(自己追加) => 1

(自己追加) => 2

(自己追加) => 3

(自己追加) => 4

    2.
 (define self-add1
    (lambda ()
      (let ((x 0))
        (set! x (+ x 1))
        x)))

(自己追加 1) => 1

(自己追加 1) => 1

(自己追加 1) => 1

上記の2つの機能の違いを理解する方法を教えてください。よろしくお願いします!よろしくお願いします。

4

3 に答える 3

5

x最初の関数は、初期値 のローカル変数を定義し、0その後ラムダ スペシャル フォームを名前にバインドします。self-addしたがってx、ラムダによって「囲まれ」ます (そのため、ラムダ from はクロージャとして動作すると言います)。のすべての呼び出しに対して(によって「記憶」されているself-addと言えます)、呼び出されるたびに の値が1 ずつ増加します。xself-addx

2 番目の関数は、ラムダをプロシージャにバインドし、その後、ラムダ内でローカル変数を定義します。xここでは、呼び出されるxたびに再定義され、すべての呼び出しで異なります。したがって、プロシージャによって「記憶」されることはなく、プロシージャが実行されるたびに新しく作成されます。が呼び出され、 で初期化されてからインクリメントされ、常に value が返されます。self-add1xself-add101

于 2012-07-01T15:21:57.183 に答える
1

最初の関数はクロージャです。x関数の字句スコープで変数を作成すると、変数は呼び出し間でその値を保持します。

追加情報:

于 2012-07-01T14:53:08.813 に答える
0

最初の関数はクロージャですが、2 番目の関数は毎回同じ関数を返すだけなので、x = 0 になり、1 を加算して結果を返します。

于 2012-07-01T15:02:05.710 に答える