6. Control Flow¶
6.1 Conditionals¶
Syntax: condition { then-block } { else-block } if
The condition is evaluated first, then both code blocks are provided, followed by the if operator which chooses which block to execute.
Examples:
// if-then (else block is empty)
x 0 > { "positive" print } { } if
// if-then-else
x 0 >
{ "positive" print }
{ "non-positive" print }
if
// Returning values
a b >
{ a }
{ b }
if // Pushes the maximum of a and b
// Nested conditionals
x 0 >
{
y 0 >
{ "both positive" print }
{ "x positive, y not" print }
if
}
{ "x not positive" print }
if
Important: The if operator parses both TokenStrings as code blocks. The condition must produce a boolean value (or truthy value) before the if operator.
6.2 While Loops¶
Syntax: { condition-block } { body-block } while
The while loop repeatedly evaluates the condition block and executes the body block as long as the condition is truthy.
Examples:
// Sum 1 to 10
0 1 // sum counter
{ dup 10 <= } // condition block
{ // body block
over over + // Add counter to sum
swap 1 + swap // Increment counter
}
while
drop // Drop counter, leave sum
// Infinite loop with break
{ true } {
// body
condition { break } { } if
} while
Condition Evaluation: The condition block is re-evaluated before each iteration. It should leave a boolean (or truthy) value on the stack.
6.3 For Loops¶
Syntax: start end { body-with-counter } for
The for loop iterates from start to end (inclusive), pushing the loop counter onto the stack for each iteration before executing the body.
Examples:
// Print 1 to 10
1 10 {
// Stack has loop counter on top
dup print
} for
// FizzBuzz
1 100 {
dup fizzbuzz
} for
// Accumulation
0 // accumulator
1 10 {
+ // add counter to accumulator
} for
// Result: 55 (sum of 1 to 10)
Loop Counter: The loop counter is automatically pushed onto the stack before each iteration. Your body block should consume it or clean it up.
6.4 Loop Control¶
break // Exit the current loop immediately
continue // Skip to the next iteration of the current loop
Examples:
// Break example
1 100 {
dup 50 ==
{ break }
{ dup print }
if
} for // Prints 1-49, stops at 50
// Continue example
1 10 {
dup 2 % 0 ==
{ continue }
{ dup print }
if
} for // Prints only odd numbers: 1 3 5 7 9
6.5 Pattern Matching¶
Syntax: value { pattern => block ... } match
Pattern matching allows you to test a value against multiple patterns and execute the corresponding block.
Examples:
// Option matching
opt_value {
Some(x) => { x print }
None => { "Nothing" print }
} match
// Multiple patterns
status {
Pending => { "Waiting" print }
Active => { "Running" print }
Complete => { "Done" print }
} match
// Result matching
result {
Ok(val) => { val process }
Err(e) => { e "Error: " swap concat print }
} match
Pattern Syntax: Patterns can match enum variants, union variants, or literal values. The matched value (if any) is bound and available in the corresponding block.