Scheme 重复代码次数
我正在学球拍,我需要一些帮助。我如何只运行这个函数4次而不是无限次地运行它Scheme 重复代码次数,scheme,racket,Scheme,Racket,我正在学球拍,我需要一些帮助。我如何只运行这个函数4次而不是无限次地运行它 (define loop (λ () (define delay (random 5)) (digital-write led1 HIGH) (sleep delay) (displayln delay) (digital-write led1 LOW) (sleep delay) (loop))) 要在一般情况下回答此问题,可以使用累加器: (define
(define loop
(λ ()
(define delay (random 5))
(digital-write led1 HIGH)
(sleep delay)
(displayln delay)
(digital-write led1 LOW)
(sleep delay)
(loop)))
要在一般情况下回答此问题,可以使用累加器:
(define (loop arg)
(if (eq? arg 0)
"Done"
(loop (sub1 arg))))
(loop 4)
这将循环arg
次。每次调用都将arg
递减一。一旦为0,您将返回所需的任何值。当然,这是一个愚蠢的例子,但演示了一个可以使用的通用模式
注意:这里使用累加器是一个误称,累加器通常在几个调用中累加一个值…一个简单的方法是使用
for
(define (do-it-once)
(define delay (random 5))
(digital-write led1 HIGH)
(sleep delay)
(displayln delay)
(digital-write led1 LOW)
(sleep delay))
(for ([n 4])
(do-it-once))
如果您发现需要经常这样做,可以使用宏扩展soegard的基于的答案,以使代码更清晰:
(define-syntax-rule (repeat num-times body ...)
(for ([n num-times])
body ...))
(repeat 4
(define delay (random 5))
(digital-write led1 HIGH)
(sleep delay)
(displayln delay)
(digital-write led1 LOW)
(sleep delay))
此宏使您的意图明确。这有助于避免阅读您的代码的人看到
[n4]
时产生混淆,因为如果您的循环很复杂,可能不会立即发现您仅使用变量n
来计算循环。但是,如果您只在一两个地方需要它,那么这肯定是过分了。如果您可以为函数添加参数,请查看随累加器提供的答案。否则,你将需要使用变异。喘息!不要向新的球拍用户鼓吹变异!:)总的来说,这是一种更好的方法+1太棒了:)谢谢你!