Control Flow
If / Elif / Else
Section titled “If / Elif / Else”Purus uses indentation to define blocks — no curly braces {} needed.
if x lt 0 console.log[///negative///]elif x eq 0 console.log[///zero///]else console.log[///positive///]if (x < 0) { console.log("negative");} else if (x === 0) { console.log("zero");} else { console.log("positive");}Multi-line blocks
Section titled “Multi-line blocks”Any statements indented under if, elif, or else belong to that block:
if logged-in const user be get-user[] console.log[///Welcome, [user.name]///] show-dashboard[]else console.log[///Please log in///] redirect[///login///]if (logged_in) { const user = get_user(); console.log(`Welcome, ${user.name}`); show_dashboard();} else { console.log("Please log in"); redirect("login");}Unless
Section titled “Unless”Negated if:
unless done keep-going[]if (!(done)) { keep_going();}Inline if (ternary)
Section titled “Inline if (ternary)”const result be if condition then 1 else 2const result = condition ? 1 : 2;Postfix modifiers
Section titled “Postfix modifiers”Write short conditionals and loops on a single line:
console.log[///debug///] if verboseconsole.log[///skip///] unless doneconsole.log[item] for item in listif (verbose) { console.log("debug");}if (!(done)) { console.log("skip");}for (const item of list) { console.log(item);}While / Until
Section titled “While / Until”while i lt 10 i be i add 1
until finished do-work[]while (i < 10) { i = i + 1;}while (!(finished)) { do_work();}For-in
Section titled “For-in”for item in items console.log[item]for (const item of items) { console.log(item);}With index:
for i; item in items console.log[i; item]for (let [i, item] of items.entries()) { console.log(i, item);}For-range
Section titled “For-range”for i in range 0; 10 console.log[i]for (let i = 0; i < 10; i++) { console.log(i);}Switch / Case / Default
Section titled “Switch / Case / Default”switch x case 1 then ///one/// case 2 then ///two/// default ///other///if (x === 1) { "one";} else if (x === 2) { "two";} else { "other";}With guards:
In case n if ..., the variable n is bound to the switch subject (value), allowing the guard condition to reference it.
switch value case n if n gt 0 console.log[///positive///] default console.log[///non-positive///]{ const n = value; if (n > 0) { console.log("positive"); } else { console.log("non-positive"); }}Match / When
Section titled “Match / When”match x when 1 then ///one/// when 2 then ///two/// else ///other///if (x === 1) { "one";} else if (x === 2) { "two";} else { "other";}With guards:
In when n if ..., the variable n is bound to the match subject (value), allowing the guard condition to reference it.
match value when n if n gt 0 console.log[///positive///] else console.log[///non-positive///]{ const n = value; if (n > 0) { console.log("positive"); } else { console.log("non-positive"); }}try / catch / finally
Section titled “try / catch / finally”try risky[]catch e console.log[e]finally cleanup[]try { risky();} catch (e) { console.log(e);} finally { cleanup();}Try as expression
Section titled “Try as expression”const result be try risky[]catch e default-valuelet result;try { result = risky();} catch (e) { result = defaultValue;}throw new Error[///something went wrong///]throw err if conditionthrow new Error("something went wrong");if (condition) { throw err;}