2017-11-06 4 views
0

ラケット変数メモリにこのコードを考えると

(define (wrapper n) 
    (define (sum-ints) 
    (set! n (+ n 1)) 
     (display n)(newline) 
     (if (= n 3) 
     n 
     (+ n (sum-ints)))) 
    (sum-ints)) 

私は3の値にNをインクリメントするためのプロセスを期待していたn = 0

(wrapper 0) => 
    1 
    2 
    3 
    6 

でこのプロシージャを呼び出します、そしてそれが返ってくると3から3を3 3 3 9の出力に加えます。

内部プロシージャはnのシャドウコピーを保存しますか?

答えて

1

Og突然変異は厄介である。ここでの問題は、「プラス」が左から右に評価されることです。具体的には、n = 2の場合を考える。式(+ n (sum-ints))は、左から右に評価されます。まず、識別子+がプラス関数に評価されます。その後、nは再帰呼び出しが行われ、その後2と評価され、結果はその後3で、私たちは一緒にそれらを追加し、その結果は、他の5

あなたはJavaで同じ結果が表示されますされ、またはサブ表現の左から右の評価を定義する言語。

この特定の問題を解決するために、IMHO:突然変異を使用しないでください。 には、人々が使用したい場合の約10%だけが必要です。

+0

この詳細な説明をありがとうございます。 –

関連する問題