Scheme 重复代码次数

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

我正在学球拍,我需要一些帮助。我如何只运行这个函数4次而不是无限次地运行它

(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太棒了:)谢谢你!