我试图在REBOL中编写一个C风格的for循环:
for [i: 0] [i < 10] [i: i + 1] [
print i
]
但是,这种语法似乎不正确:
*** ERROR
** Script error: for does not allow block! for its 'word argument
** Where: try do either either either -apply-
** Near: try load/all join %/users/try-REBOL/data/ system/script/args...
REBOL是否有任何类似于C风格for循环的内置函数,或者我是否需要自己实现此函数?
类似C语言的等效结构看起来像这样,但我不确定是否可以在REBOL中实现相同的模式:
for(i = 0; i < 10; i++){
print(i);
}
答案 0 :(得分:6)
由于rebol3标记,我会假设此问题与Rebol 3有关。
Rebol 3提议的“CFOR”
对于Rebol 3,有一个提议(得到了相当多的支持),一个“一般循环”非常符合C风格的for
,因此目前名称为{ {1}}:请参阅CureCode issue #884了解所有血腥细节。
这包括Ladislav原始实现的一个非常精炼的版本,当前(截至2014-05-17)版本我将在这里重现(没有广泛的内联评论讨论实现方面),以便于参考:
cfor
Rebol 3中用户级控制结构实现的一般问题
Rebol 3中控件构造的所有用户级实现的一个重要的一般性评论:R3中没有类似于Rebol 2的cfor: func [ ; Not this name
"General loop based on an initial state, test, and per-loop change."
init [block! object!] "Words & initial values as object spec (local)"
test [block!] "Continue if condition is true"
bump [block!] "Move to the next step in the loop"
body [block!] "Block to evaluate each time"
/local ret
] [
if block? init [init: make object! init]
test: bind/copy test init
body: bind/copy body init
bump: bind/copy bump init
while test [set/any 'ret do body do bump get/any 'ret]
]
属性(参见CureCode issue #539),所以这样的用户编写(“夹层”,在Rebol lingo中)控制或循环功能一般都有问题。
特别是,此CFOR会错误地捕获[throw]
和return
。为了说明,请考虑以下功能:
exit
您(正确地)期望foo: function [] [
print "before"
cfor [i: 1] [i < 10] [++ i] [
print i
if i > 2 [return true]
]
print "after"
return false
]
实际从return
返回。但是,如果你尝试上述内容,你会发现这种期望令人失望:
foo
这句话当然适用于所有在此线程中作为答案给出的用户级实现,直到bug#539被修复。
答案 1 :(得分:3)
Ladislav Mecir有一个优化的Cfor
cfor: func [
{General loop}
[throw]
init [block!]
test [block!]
inc [block!]
body [block!]
] [
use set-words init reduce [
:do init
:while test head insert tail copy body inc
]
]
答案 2 :(得分:2)
大多数人在这种特殊情况下使用的另一种控制结构是repeat
repeat i 10 [print i]
导致:
>> repeat i 10 [print i]
1
2
3
4
5
6
7
8
9
10
我通常不会经常使用loop
,但它可以在相似的程度上使用:
>> i: 1
>> loop 10 [print ++ i]
1
2
3
4
5
6
7
8
9
10
这些是一些有用的控制结构。不确定您是否在寻找cfor
,但您从其他人那里得到了答案。
答案 3 :(得分:1)
我已经实现了一个与C for循环相同的函数。
cfor: func [init condition update action] [
do init
while condition [
do action
do update
]
]
以下是此功能的一个示例用法:
cfor [i: 0] [i < 10] [i: i + 1] [
print i
]
答案 4 :(得分:0)
对于简单的初始值,上限和步骤,以下工作:
for i 0 10 2
[print i]
这非常接近C for
循环。