球拍变量记忆
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% 的情况下人们想要使用它。
鉴于此代码:
(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% 的情况下人们想要使用它。