Scheme 在球拍中使用断环

Scheme 在球拍中使用断环,scheme,racket,Scheme,Racket,我可以在球拍中使用“while”循环,代码来自 但是,我想在无限循环中使用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; (定义(testfn)

我可以在球拍中使用“while”循环,代码来自

但是,我想在无限循环中使用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; 
(定义(testfn)
(定义x5)
(while循环#t;无限while循环;
(打印LN x)
(集!x(子1 x))
(当(

如何在不确定while循环上方插入中断?谢谢你的评论/回答。

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

通过不递归来打破循环。任何其他值都将成为表单的结果

(define (helper x) 
  (displayln x) 
  (if (< x 0)
      'return-value
      (helper (sub1 x))) 
(helper 5)
查看
while循环
只是一个宏,它使用名为
let
的宏,该宏将变成一个递归过程

如果您编写的表达式最终变为false,而不是
#t
,则表达式将停止。比如:

(while-loop (<= 0 x)
  ...)

(while loop(如链接问题的公认答案中所述,根本不建议以这种方式进行循环。使用标准方案时,避免命令式循环,更喜欢递归(使用辅助程序或命名的
let
),或在Racket中使用

< > >代码>中断< /代码>不是标准的方案构造。考虑使用一个不需要显式中断的更习惯性的球拍改写逻辑,避免命令式:

(define (testfn n)
  (for [(x (in-range n -1 -1))]
    (println x)))

(testfn 5)
=> 5
   4
   3
   2
   1
   0

问题中的代码使用命令式样式,这不是我们在Scheme中编写循环的方式。
(while-loop (<= 0 x)
  ...)
(define (testfn n)
  (for [(x (in-range n -1 -1))]
    (println x)))

(testfn 5)
=> 5
   4
   3
   2
   1
   0