Scheme 在球拍中使用断环
我可以在球拍中使用“while”循环,代码来自 但是,我想在无限循环中使用break,如下所示: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)
(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