Scheme中的过程内部的计数器

Scheme中的过程内部的计数器,scheme,counter,Scheme,Counter,我编写了一个过程,在调用时显示消息“msg0”“freq0”次和“msg1”“freq1”次,并定期这样做 以下是我的程序代码: (define (make-counter n) (lambda () (set! n (+ n 1)) n)) (define counter1 (make-counter -1)) (define (rotating-msg msg0 msg1 freq0 freq1) (let ([period (+ freq0 freq1)] [c

我编写了一个过程,在调用时显示消息“msg0”“freq0”次和“msg1”“freq1”次,并定期这样做

以下是我的程序代码:

(define (make-counter n)
  (lambda () (set! n (+ n 1)) n))

(define counter1 (make-counter -1))

(define (rotating-msg msg0 msg1 freq0 freq1)
  (let ([period (+ freq0 freq1)]
        [count (counter1)])
    (cond ((< (remainder count period) freq0) msg0)
          (else msg1))))
但是,以下情况不起作用:

> (define foobar (rotating-msg 'foo 'bar 1 2))
> foobar
foo
> foobar
foo
> foobar
foo

在第一个示例中,您每次调用
counter1
,这将使n加1。在第二个示例中,
counter1
只被调用一次,因此n保持在值0

这方面的标准方法如下:

(define (rotating-message msg0 msg1 freq0 freq1)
  (let ((n 0) (total (+ freq0 freq1)))
    (lambda ()
      (let ((nn (modulo n total)))
        (begin0
          (if (< nn freq0) msg0 msg1)
          (set! n (+ n 1)))))))

(define r (rotating-message 'foo 'bar 1 2))

(for/list ((i (in-range 10))) (r))
=>'(foo bar bar foo bar bar foo bar bar foo)
(定义(旋转消息msg0 msg1 freq0 freq1)
(让((n0)(总数(+freq0 freq1)))
(lambda()
(let((nn(总模n)))
(开始
(如果('(foo-bar-bar-foo-bar-foo-bar-foo)
(define (rotating-message msg0 msg1 freq0 freq1)
  (let ((n 0) (total (+ freq0 freq1)))
    (lambda ()
      (let ((nn (modulo n total)))
        (begin0
          (if (< nn freq0) msg0 msg1)
          (set! n (+ n 1)))))))

(define r (rotating-message 'foo 'bar 1 2))

(for/list ((i (in-range 10))) (r))
=>'(foo bar bar foo bar bar foo bar bar foo)