Scheme / Racket中的静态变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scheme / Racket中的静态变量?相关的知识,希望对你有一定的参考价值。
在C中,您可以在方法中拥有一个静态变量,该变量可以记住先前调用该方法所设置的值。我听说在Scheme中使用continuation可以找到相同的效果。任何人都可以告诉我如何在不使用变异的情况下为Scheme中的函数创建静态变量的类似效果?
答案
你不需要延续。这是一个经典的例子:
(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;
});
})();
另一答案
您可以在Scheme(或任何具有正确的lambda
构造的语言)中关闭值,因此closures为您提供了一个获得“静态变量”的好方法。
(如果你想改变这些封闭的值,你可以将它们放在一个容器中)
另一答案
例如,如果我们想在名为'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)
以上是关于Scheme / Racket中的静态变量?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?
Racket Lang - Scheme如何组合环境的变量和值列表