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如何组合环境的变量和值列表

Racket 与 Scheme 宏

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

Scheme/Racket中letrec的含义

Scheme可以在没有Racket的情况下做GUI吗?还是必须使用 Common Lisp?