Racket中的While循环

4
在Racket中编写一个像Java等语言中的“while循环”一样的过程。while循环需要两个代码块:一个条件和一个主体。它运行主体,然后再次尝试条件,如果条件为真,则再次运行主体。这将继续,直到条件返回false。
以下是我开始编写while循环的方式,但我卡住了。
(define (while condition body)
   (when (true? condition)
       (cons (proc body) (proc (rest body)))

2
这回答了你的问题吗?DrRacket中的While循环宏 - Gwang-Jin Kim
2个回答

2

conditionbody都是程序,因此您必须调用它们。

在调用body后,您必须递归调用while以重复执行。

(define (while condition body)
  (when (condition)
    (body)
    (while condition body)))

你不需要使用true?,因为when仅检查条件是否为#f


1

在Scheme中,while必须使用宏来避免参数的评估。

(define-syntax while
  (syntax-rules ()
    ((_ pred b1 ...)
     (let loop () (when pred b1 ... (loop))))))

OP被要求编写一个过程,而不是宏;在这种情况下,“condition”和“body”表示过程,即它们评估为过程,这些过程将在“while”内使用。 - ad absurdum
好的,谢谢。但是,除非像你说的那样条件和主体都被评估为过程,否则你无法使用过程进行真正的While或Do操作。但我确实没有看到它可以完成什么用处。最初的问题是关于Java中的while,为了在Scheme中做同样的事情,需要用宏来实现。 - Damien Mattei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接