如何使用let in Racket继续进行下一次迭代



我正试图修改下面的代码,以便当(when (= i 6) (loop (+ 1 i)))出现时,循环移动到下一次迭代,而不继续执行";做事;部分

(let loop ([i 0])
(cond
[(= i 10) (printf "endn")]
[else
(when (= i 6) (loop (+ 1 i)))
(define x (+ 1 2)) ; do stuff
(printf "~an" i)
(loop (+ 1 i))]))

基本上,我试图获得的是类似于";继续";来自C#(就像下面的代码(,但使用let in Racket:

for (int i = 0; i < 10; i++) 
{
if (i == 6) 
{
continue;
}
Console.WriteLine(i);
}    

如果这在Racket中是不可能的(或推荐的(,我可以使用什么作为替代方案?

通过否定条件在没有continue的情况下重写:

for (int i = 0; i < 10; i++) 
{
if (i != 6) 
{
Console.WriteLine(i);
}
}    

则作为CCD_ 3而不是CCD_

int i = 0;
while (i < 10) 
{
if (i != 6) 
{
Console.WriteLine(i);
}
i += 1;
}    

然后这几乎有完全相同的形式:

(let loop ([i 0])
(when (< i 10)
(unless (= i 6)
(printf "~an" i))
(loop (+ 1 i))))

您可以通过在cond表达式中添加一个额外的case来获得所需的效果。这相当于您的C#示例:

(let loop ([i 0])
(cond [(= i 10) (printf "endn")]
[(= i  6) (loop  (add1 i))]
[else
; do some other stuff
(printf "~an" i)
(loop (add1 i))]))

你可以"做事;在每个条件之后,只要最后一个表达式是递归或递归调用的出口,请记住,只会返回最后一个公式的值,如果需要将值传递给下一次迭代,则需要向递归调用添加参数。

最新更新