球拍变量记忆

Racket variable memory

鉴于此代码:

(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,然后 returns,将 3 加 3 加 3 以获得 3 3 3 9 的输出。

内部过程是否存储了n的卷影副本?

哎呀,变种太恶心了。这里的问题是 "plus" 是从左到右求值的。具体来说,让我们考虑 n=2 的情况。表达式 (+ n (sum-ints)) 从左到右求值。首先,标识符 + 求值为 plus 函数。然后,n 的计算结果为 2。然后,进行递归调用,结果为 3。然后,我们将它们相加,结果为 5。

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

这个特定问题的解决方案,恕我直言:不要使用突变。仅在 大约 10% 的情况下人们想要使用它。