For statements#
Code Example
Runnable Example in Jac and JacLib
# For Statements
with entry {
# Basic for-in loop
for x in [1, 2, 3] {
print(x);
}
# For-in with range
for i in range(5) {
print(i);
}
# For-to-by loop
for i=0 to i<5 by i+=1 {
print(i);
}
# For-to-by counting down
for i=10 to i>0 by i-=1 {
print(i);
}
# For-to-by with different step
for i=0 to i<10 by i+=2 {
print(i);
}
# For with else clause (executes when loop completes normally)
for x in [1, 2, 3] {
print(x);
} else {
print("completed");
}
# For with break (else clause skipped)
for x in range(10) {
if x == 3 {
break;
}
print(x);
} else {
print("not reached");
}
# For with continue
for x in range(5) {
if x % 2 == 0 {
continue;
}
print(x);
}
# Nested for loops
for i in range(3) {
for j in range(2) {
print(f"{i},{j}");
}
}
# For-in over string
for char in "abc" {
print(char);
}
# For-in over dictionary keys
d = {"a": 1, "b": 2};
for key in d {
print(key);
}
# Mix for-in and for-to-by in nested loops
for i in ["a", "b"] {
for j=0 to j<2 by j+=1 {
print(f"{i}{j}");
}
}
}
Jac Grammar Snippet
Description
For Statements in Jac
For loops provide iteration over collections and sequences. Jac offers two distinct loop styles: the for-in
pattern for iterating collections, and the for-to-by
pattern for explicit counter control.
Basic For-In Loop
The simplest iteration pattern uses for-in
to loop through collections (lines 5-7):
The loop variable x
takes each value from the list in sequence. This works with any iterable: lists, tuples, sets, dictionaries, strings, and ranges.
For-In with Range
Lines 10-12 demonstrate using range()
to generate numeric sequences. This produces values 0 through 4. The range()
function is lazy, generating values on demand rather than creating a full list in memory.
For-To-By Loop (Jac's C-Style Loop)
Lines 15-17 show Jac's unique three-part loop syntax. This loop has three components:
- Initialization (i=0
): Sets the starting value
- Condition (to i<5
): Loop continues while true
- Increment (by i+=1
): Executed after each iteration
This provides explicit control similar to C's for(int i=0; i<5; i++)
but with more readable syntax.
Counting Down
Line 20-22 shows decrementing with for-to-by
. The loop starts at 10, continues while i>0
, and decrements by 1 each iteration.
Custom Step Values
Lines 25-27 demonstrate non-unit steps. This produces even numbers: 0, 2, 4, 6, 8.
For-Else Clause
Lines 30-34 introduce the else
clause, which executes only if the loop completes normally (without break
). This pattern is useful for search operations: if you break when finding an item, the else clause indicates "not found."
Breaking Out of Loops
Lines 37-44 show how break
exits the loop immediately and skips the else clause. Output: 0, 1, 2 (the else block doesn't execute).
Continue Statement
Lines 47-52 demonstrate continue
, which skips to the next iteration. This prints only odd numbers: 1, 3.
Nested Loops
Lines 55-59 show loops within loops. Both for-in
and for-to-by
loops can be nested and mixed freely.
Iterating Strings
Lines 62-64 demonstrate character iteration. Strings are iterable sequences of characters.
Dictionary Iteration
Lines 67-70 show that iterating a dictionary yields its keys. Use .values()
for values or .items()
for key-value pairs.
Mixed Loop Types
Lines 73-77 demonstrate combining different loop styles. The outer loop uses for-in
while the inner uses for-to-by
.
Loop Control Flow Summary
Statement | Effect | Else Clause Behavior |
---|---|---|
break |
Exit loop immediately | Skipped |
continue |
Skip to next iteration | Not affected |
Normal completion | Loop finishes naturally | Executes (if present) |
For Loop Variations
Form | Syntax | Use Case |
---|---|---|
for-in | for var in iterable |
Iterate collections |
for-to-by | for i=start to cond by step |
Explicit counter control |
for-else | for ... { } else { } |
Detect uninterrupted completion |
Loop Flow Visualization
flowchart TD
Start([Start For Loop]) --> Check{Condition<br/>True?}
Check -->|Yes| Body[Execute Body]
Body --> Continue{Continue<br/>Statement?}
Continue -->|Yes| Update
Continue -->|No| Break{Break<br/>Statement?}
Break -->|Yes| End([Exit Loop])
Break -->|No| Update[Update/Next Item]
Update --> Check
Check -->|No| Else{Else<br/>Clause?}
Else -->|Yes, No Break| ElseBody[Execute Else]
Else -->|No| End
ElseBody --> End
Common Patterns
Filtering during iteration:
Aggregating values:
Finding with for-else:
Key Differences from Python
- Braces required: Jac uses
{ }
for loop bodies, not indentation - Semicolons required: Each statement ends with
;
- For-to-by syntax: Unique to Jac, provides C-style explicit control
- Same else clause: Works identically to Python