重复代码次数

时间:2014-11-08 18:07:33

标签: scheme racket

我学习球拍,我需要一些帮助。如何仅运行此功能4次而不是无限运行?

(define loop
  (λ ()
    (define delay (random 5))
    (digital-write led1 HIGH)
    (sleep delay)
    (displayln delay)
    (digital-write led1 LOW)
    (sleep delay)
    (loop)))

3 个答案:

答案 0 :(得分:5)

一种简单的方法是使用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))

答案 1 :(得分:1)

如果您发现需要经常这样做,可以使用宏扩展soegard基于for的答案,以使代码更清晰:

(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))

这个宏使你的意图明确。这对于在阅读代码的人看到[n 4]时避免混淆很有用,因为如果你的循环很复杂,你可能不会立即明白你只使用变量n来计算循环。如果你只在一两个地方需要它,这肯定是矫枉过正的。

答案 2 :(得分:0)

要回答一般情况下的这个问题,你可以使用累加器:

(define (loop arg)
    (if (eq? arg 0)
        "Done"
        (loop (sub1 arg))))

(loop 4)

这将循环arg次。每次通话都会将arg减1。一旦为0,您将返回所需的任何值。当然,这是一个写的愚蠢的例子,但演示了一个你可以使用的一般模式。

注意:累加器的使用在这里用词不当,累加器通常会累积多次调用的值......