REBOL中的C风格循环

时间:2014-05-17 00:53:52

标签: rebol rebol3

我试图在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);
}

5 个答案:

答案 0 :(得分:6)

由于标记,我会假设此问题与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循环。