在 Racket 中使用 break from loop

rns*_*nso 2 scheme racket

我可以在 DrRacket 中使用来自While Loop Macro 的代码在 Racket 中使用“while”循环

(define-syntax-rule (while-loop condition body ...)   
  (let loop ()
    (when condition
      body ...
      (loop))))
Run Code Online (Sandbox Code Playgroud)

但是,我想在无限循环中使用 break ,如下所示:

(define (testfn)
  (define x 5)
  (while-loop #t          ; infinite while loop; 
    (println x)
    (set! x (sub1 x))
    (when (< x 0)
       (break))))         ; HOW TO BREAK HERE; 
Run Code Online (Sandbox Code Playgroud)

如何在上面的无限while循环中插入break?感谢您的评论/回答。

Syl*_*ter 5

你没有。Racket 属于 Scheme 系列,因此所有循环实际上都是通过递归完成的。

您可以通过不递归来跳出循环。任何其他值都将成为表单的结果。

(define (helper x) 
  (displayln x) 
  (if (< x 0)
      'return-value
      (helper (sub1 x))) 
(helper 5)
Run Code Online (Sandbox Code Playgroud)

有一些宏可以使语法更简单。使用命名let是一种:

(let helper ((x 5))
  (displayln x) 
  (if (< x 0)
      'return-value
      (helper (sub1 x)))
Run Code Online (Sandbox Code Playgroud)

看着你while-loop的只是一个使用命名let宏的宏,它变成了一个递归过程。

如果你不是#t写一个最终变成假的表达式,它就会停止。喜欢:

(while-loop (<= 0 x)
  ...)
Run Code Online (Sandbox Code Playgroud)

请注意,使用set!来更新循环中的变量不被认为是好的做法。如果您正在学习 Racket,请尽量不要使用set!或您的新循环结构。尝试使用命名let或letrec。