--- Title: 6 Control Flow Prev: Functions Next: Data Structures --- ## 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. ---