鉴于此代码:
(define (wrapper n)
(define (sum-ints)
(set! n (+ n 1))
(display n)(newline)
(if (= n 3)
n
(+ n (sum-ints))))
(sum-ints))
使用 调用此程序 n = 0
(wrapper 0) =>
1
2
3
6
我原本期望过程将n增加到值3,然后当它返回时,添加3到3到3,输出为3 3 3 9。
内部过程是否存储n?
的卷影副本答案 0 :(得分:1)
Oog,变异是令人讨厌的。这里的问题是"加"从左到右进行评估。具体来说,让我们考虑n = 2时的情况。表达式(+ n (sum-ints))
从左到右进行评估。首先,标识符+
评估为加号函数。然后,n
求值为2.然后,进行递归调用,结果为3.然后,我们将它们加在一起,结果为5.
您将在Java或任何其他定义从左到右评估子表达式的语言中看到相同的结果。
解决这个特殊问题,恕我直言:不要使用突变。它只需要它 大约10%的人都想使用它。