Control flow
Braces are always required. if is an expression. loop can return a value. Loops can be labeled for nested breaks.
let x = 5
if x > 0 {
println("positive")
} elif x < 0 {
println("negative")
} else {
println("zero")
}
-- if as an expression
let sign = if x > 0 { "+" } else if x < 0 { "-" } else { "0" }
println(sign)
var i = 0
while i < 5 {
print("{i} ")
i += 1
}
println()
for iterates over arrays, ranges, strings (via .chars()), maps, and any generator.
-- over array
for x in [10, 20, 30] {
print("{x} ")
}
println()
-- over range (exclusive)
for i in 0..5 {
print("{i} ")
}
println()
-- over range (inclusive)
for i in 1..=3 {
print("{i} ")
}
println()
-- over map: iterates key-value pairs
let m = #{"a": 1, "b": 2, "c": 3}
for (k, v) in m {
println("{k} = {v}")
}
loop runs forever until an explicit break. It can return a value via break.
var n = 0
let result = loop {
n += 1
if n >= 5 { break n * 10 }
}
println(result) -- 50
for i in 0..10 {
if i % 2 == 0 { continue } -- skip even
if i > 7 { break } -- stop early
print("{i} ")
}
println() -- 1 3 5 7
Labels let you break or continue an outer loop from inside a nested one.
var found = false
outer: for i in 0..5 {
for j in 0..5 {
if i * j == 6 {
println("found: i={i}, j={j}")
found = true
break outer
}
}
}
println(found) -- true