我可以在 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?感谢您的评论/回答。
你没有。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。
| 归档时间: |
|
| 查看次数: |
3328 次 |
| 最近记录: |