コンテンツにスキップ

制御フロー

Purusはインデントでブロックを定義します。波括弧 {} は不要です。

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");
}

ifelifelse の下にインデントされた文はそのブロックに属します:

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");
}

否定の if:

unless done
keep-going[]
if (!(done)) {
keep_going();
}
const result be if condition then 1 else 2
const result = condition ? 1 : 2;

短い条件分岐やループを1行で書けます:

console.log[///debug///] if verbose
console.log[///skip///] unless done
console.log[item] for item in list
if (verbose) {
console.log("debug");
}
if (!(done)) {
console.log("skip");
}
for (const item of list) {
console.log(item);
}
while i lt 10
i be i add 1
until finished
do-work[]
while (i < 10) {
i = i + 1;
}
while (!(finished)) {
do_work();
}
for item in items
console.log[item]
for (const item of items) {
console.log(item);
}

インデックス付き:

for i; item in items
console.log[i; item]
for (let [i, item] of items.entries()) {
console.log(i, item);
}
for i in range 0; 10
console.log[i]
for (let i = 0; i < 10; i++) {
console.log(i);
}
switch x
case 1 then ///one///
case 2 then ///two///
default ///other///
if (x === 1) {
"one";
} else if (x === 2) {
"two";
} else {
"other";
}

ガード付き:

case n if ... において、変数 n はswitchの対象(value)にバインドされ、ガード条件でその値を参照できます。

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 x
when 1 then ///one///
when 2 then ///two///
else ///other///
if (x === 1) {
"one";
} else if (x === 2) {
"two";
} else {
"other";
}

ガード付き:

when n if ... において、変数 n はmatchの対象(value)にバインドされ、ガード条件でその値を参照できます。

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
risky[]
catch e
console.log[e]
finally
cleanup[]
try {
risky();
} catch (e) {
console.log(e);
} finally {
cleanup();
}
const result be try
risky[]
catch e
default-value
let result;
try {
result = risky();
} catch (e) {
result = defaultValue;
}
throw new Error[///something went wrong///]
throw err if condition
throw new Error("something went wrong");
if (condition) {
throw err;
}