Flow Control
Conditionals
if / else
The condition is a compact expression or a full command:
else if
if in let and Assignments
if statements can be the right-hand side of let bindings and assignments:
let max = if (a > b)
a
else
b
let msg = if (count == 0)
"empty"
else if (count == 1)
"one"
else
"many"
# Also works with assignment
result = if error
get_error_message $error
else
data
Loops
while
for
Iterate over arrays, dictionaries, ranges, and other iterables:
for item = [1, 2, 3]
echo $item
for pair = {name: "Alice", age: 30}
echo $pair
for i = range 5
echo $i
Dictionaries iterate as [key, value] pairs. Use destructuring to unpack them:
See Destructuring for more on for unpacking.
Flow Control Statements
break
Exit the innermost loop.
break works through intervening do blocks:
def find_incomplete configs
for config = configs
config.get "host" else: do
break
process $config
"done"
continue
Skip to the next iteration.
continue works through intervening do blocks:
return
Return a value from a function early.
def find_first arr pred
for item = arr
if pred $item
return item
nil
let result = find_first [1, 2, 3, 4] do |x| (x > 2)
assert_eq $result 3
return exits the innermost enclosing def, even when called from within a
do block:
def validate_record record
for field = ["id", "name", "email"]
record.get field else: do
return {valid: false, missing: field}
{valid: true}
let result = validate_record {name: "Alice", email: "alice@example.com"}
# Returns: {valid: false, missing: "id"}
throw
Raises an error, unwinding the call stack until the error is caught
by a try/catch block.
See Error Handling for full details on raising and catching errors.