Статические переменные в схеме / ракетке?
В языке C внутри метода может быть статическая переменная, которая может запоминать значения, заданные предыдущими вызовами метода. Я слышал, что тот же самый эффект можно найти, используя продолжения внутри схемы. Может ли кто-нибудь показать мне, как создать подобный эффект статической переменной для функции в схеме без использования мутации?
3 ответа:
Для этого вам не нужны продолжения. Вот классический пример:
(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; }); })();
Вы можете закрыть значения в схеме (или любом языке с приличной конструкцией
lambda
), поэтому замыкания дают вам хороший способ иметь "статические переменные".(и если вы хотите изменить эти закрытые значения, вы можете поместить их в контейнер)