クロージャー付きのスキームで値をインクリメントするにはどうすればよいですか?私はsicpコースの講義3Aにいます。
(define (sum VAL)
// how do I increment VAL everytime i call it?
(lambda(x)
(* x x VAL)))
(define a (sum 5))
(a 3)
set!
増分値を保存するために使用します。これを試して:
(define (sum VAL)
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL)))
のでVAL
一度に囲まれたsum
プロシージャが呼ばれた、あなたが呼び出すたびa
に、中に前の値を「覚えている」だろうVAL
と、それは1つの単位インクリメントますよ。例えば:
(define a (sum 5)) ; VAL = 5
(a 3) ; VAL = 6
=> 54 ; (* 3 3 6)
(a 3) ; VAL = 7
=> 63 ; (* 3 3 7)
コメントへの回答:確かに、を使用できますがlet
、実際には必要ありません。以前と同じ効果があります。違いは、前のコードで囲まれた関数パラメーターを変更し、現在は囲まれたlet
定義変数を変更していることですが、結果は同じです。ただし、これは、n
初期化する前に何らかの操作を実行する必要がある場合に役立ちますVAL
。
(define (sum n)
(let ((VAL n))
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL))))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加