在C中,您可以在方法中拥有一个静态变量,该变量可以记住先前调用该方法所设置的值。我听说在Scheme中使用continuation可以找到相同的效果。任何人都可以告诉我如何在不使用变异的情况下为Scheme中的函数创建静态变量的类似效果?
答案 0 :(得分:9)
你不需要延续。这是一个典型的例子:
(define counter
(let ([n 0])
(lambda ()
(set! n (add1 n))
n)))
(list (counter) (counter) (counter))
这是一个明显的概括,使它更有趣:
(define (make-counter n)
(lambda ()
(set! n (add1 n))
n))
(define a (make-counter 0))
(define b (make-counter 10))
(list (a) (a) (a) (b) (b) (a) (a))
这是翻译成JS的第一段代码:
var counter = (function() {
var n = 0;
return (function() {
n++;
return n;
});
})();
答案 1 :(得分:1)
您可以关闭Scheme中的值(或任何具有正确lambda
构造的语言),因此closures为您提供了获取“静态变量”的好方法。
(如果你想改变这些封闭的值,你可以将它们放在一个容器中)
答案 2 :(得分:0)
例如,如果我们想在名为'f'的函数中设置一个名为'a'的静态变量,那么我们可以像这样写:
(define f
(let ((a 5))
(lambda (m)
(if (> m 7)
(set! a (- a 1))
(set! a (+ a m)))
a)))
(f 1)
(f 2)