Rebol3 Code Examplex


Increment loop index within loop body

Modify a loop counter from inside the loop.

Rebol [
    title: "Rosetta code: Increment loop index within loop body"
    file: %Increment_loop_index_within_loop_body.r3
    url: https://rosettacode.org/wiki/Increment_loop_index_within_loop_body
    needs: 3.0.0
]

;; prime? native function is available since 3.19.5
if unset? 'prime? [
    ;; Naive Rebol implementation
    prime?: function [n [integer!]] [
        if n < 2 [return false]
        if zero? n % 2 [return n == 2]
        if zero? n % 3 [return n == 3]
        d: 5
        while [d * d <= n][
            if zero? n % d [return false]
            d: d + 2
            if zero? n % d [return false]
            d: d + 4
        ]
        true
    ]
]

;; Helper to format number with commas
format-commas: function [num [integer!]] [
    str: reverse form num
    while [not tail? str: skip str 3][
        str: insert str "," 
    ]
    reverse head str
]

;; Main logic
index: 42           ;; start index at 42 (before first increment)
count-primes: 0     ;; count of primes found

while [count-primes < 42] [
    index: index + 1     ;; increment index by 1 at iteration start
    if prime? index [
        count-primes: count-primes + 1
        print rejoin [
            pad count-primes -2
            ": prime = "
            pad format-commas index -18
        ]
        ;; increment index by the prime itself (old index + prime)
        index: index + index
    ] ()
]

Output:

 1: prime =                 43
 2: prime =                 89
 3: prime =                179
 4: prime =                359
 5: prime =                719
 6: prime =              1,439
 7: prime =              2,879
 8: prime =              5,779
 9: prime =             11,579
10: prime =             23,159
11: prime =             46,327
12: prime =             92,657
13: prime =            185,323
14: prime =            370,661
15: prime =            741,337
16: prime =          1,482,707
17: prime =          2,965,421
18: prime =          5,930,887
19: prime =         11,861,791
20: prime =         23,723,597
21: prime =         47,447,201
22: prime =         94,894,427
23: prime =        189,788,857
24: prime =        379,577,741
25: prime =        759,155,483
26: prime =      1,518,310,967
27: prime =      3,036,621,941
28: prime =      6,073,243,889
29: prime =     12,146,487,779
30: prime =     24,292,975,649
31: prime =     48,585,951,311
32: prime =     97,171,902,629
33: prime =    194,343,805,267
34: prime =    388,687,610,539
35: prime =    777,375,221,081
36: prime =  1,554,750,442,183
37: prime =  3,109,500,884,389
38: prime =  6,219,001,768,781
39: prime = 12,438,003,537,571
40: prime = 24,876,007,075,181
41: prime = 49,752,014,150,467
42: prime = 99,504,028,301,131