Статические переменные в схеме / ракетке? - PullRequest
3 голосов
/ 14 декабря 2011

В C вы можете иметь статическую переменную внутри метода, которая может запоминать значения, для которых она была установлена ​​предыдущими вызовами метода.Я слышал, что тот же эффект можно найти, используя продолжения в Схеме.Может кто-нибудь показать мне, как создать аналогичный эффект статической переменной для функции в Scheme без использования мутации?

Ответы [ 3 ]

9 голосов
/ 14 декабря 2011

Тебе не нужны продолжения для этого.Вот классический пример:

(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 голос
/ 14 декабря 2011

Вы можете закрывать значения в Scheme (или любом языке с приличной конструкцией lambda), поэтому замыкания дают хороший способ иметь "статические переменные".

(иесли вы хотите изменить эти закрытые значения, вы можете поместить их в контейнер)

0 голосов
/ 30 июля 2014
Например,

, если мы хотим установить статическую переменную с именем «a» в функции с именем «f», то мы можем написать так:

(define f
  (let ((a 5))
    (lambda (m) 
      (if (> m 7)
          (set! a (- a 1))
          (set! a (+ a m)))
      a)))
(f 1)
(f 2)
...