我有DrRacket版本5.0.2,我花了3个小时就已经在寻找合适的库来使while
,dolist
和dotimes
工作。我知道如何使用它们但我找不到合适的库。例如,当我输入dotimes
时,它会告诉我未知的标识符。
PS:您是否必须使用define-syntax
来定义这些循环?我试过了(require srfi/42)
,但它不起作用。我正在使用#lang scheme
。
答案 0 :(得分:9)
您可以改用Racket的built-in iteration forms:
您可以写(dolist (x some-list) body-forms ...)
(for ((x some-list)) body-forms ...)
只要(dotimes (i n) body-forms ...)
是非负整数,就可以使用(for ((i (in-range 0 n))) body-forms ...)
,甚至只使用(for ((i n)) body-forms ...)
,而不是n
。
您可以编写语法规则宏来将CL风格的循环转换为Racket风格的循环,但它可能不值得。 Racket for
- 表单本身比dotimes
或dolist
更灵活,因为您可以轻松地使用它们一次迭代多个序列。
答案 1 :(得分:0)
数字实际上是一个序列。
> (sequence->list 5)
'(0 1 2 3 4)
(for ((i (in-range n))) body-forms ...)
也有效。 in-range
更快。
答案 2 :(得分:0)
现在还有针对Racket的Common Lisp loop
宏的实现。像这样导入:
(require (planet jphelps/loop))