2

フローをたどろうとしている非常に単純なコードがあり、理解していると思いますが、確認したいだけです

(define count
  (let ([next 0])
    (lambda ()
      (let ([v next])
        (set! next (+ next 1))
        v))))

基本的に、count は呼び出された回数を追跡します。最初に呼び出したとき、next は let を使用して 0 に設定されます。その後、set! を使用して 1 に変更します。(let ([next 0]) が、プログラムが呼び出されるたびに next を 0 に戻さない理由を理解しようとしています。私が知る限り、(lambda () ...) は実際の関数は (引数を取らずに) 開始するので、再度 count を呼び出すと、そのスコープ (set! one) 内の next の値を使用して、そこから実行されます。

私は思う...私は正直まだ少し確信が持てません。セットします!最初の行が (let ((next 0))) であっても、count を再度呼び出すと、自動的に next が永続的に変更されるだけで、実際にはゼロに戻りませんか?

4

1 に答える 1

2

あなたの直感は正しいです。この部分:は、名前にバインドされる(let ([next 0])1回だけ実行されます。これは、最初の式が値として最後の式を返すためです。これはたまたまであり、変数にバインドされるのはこのためです。lambdacountletlambdacount

関数定義が終了すると、プロシージャの実際の実行は次のcount行から始まり(let ([v next])ます。これは、プロシージャが呼び出されるたびに発生します。プロシージャのnextすべての呼び出しで同じである変数は、作成時にクロージャ内で環境の一部としてキャプチャされたため、count内部でアクセスできます。countlambda

于 2012-11-18T04:03:47.223 に答える