Scheme中的过程内部的计数器
我编写了一个过程,在调用时显示消息“msg0”“freq0”次和“msg1”“freq1”次,并定期这样做 以下是我的程序代码: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
(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)