球拍可变记忆

时间:2017-11-06 04:27:20

标签: scheme racket r5rs

鉴于此代码:

(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?

的卷影副本

1 个答案:

答案 0 :(得分:1)

Oog,变异是令人讨厌的。这里的问题是"加"从左到右进行评估。具体来说,让我们考虑n = 2时的情况。表达式(+ n (sum-ints))从左到右进行评估。首先,标识符+评估为加号函数。然后,n求值为2.然后,进行递归调用,结果为3.然后,我们将它们加在一起,结果为5.

您将在Java或任何其他定义从左到右评估子表达式的语言中看到相同的结果。

解决这个特殊问题,恕我直言:不要使用突变。它只需要它 大约10%的人都想使用它。