コンテンツにスキップ

構文の概要

拡張子出力説明
.purus.js標準JavaScript
.cpurus.cjsCommonJSモジュール
.mpurus.mjsESモジュール
-- これは行コメントです
--- これはブロック
コメントです ---

文字列はトリプルスラッシュ /// で囲みます:

const greeting be ///Hello, World///
エスケープ結果
\n改行
\tタブ
\\バックスラッシュ
\//
\[[(リテラルブラケット)
\]](リテラルブラケット)

文字列補間(テンプレートリテラル)

Section titled “文字列補間(テンプレートリテラル)”

文字列内で [式] を使い、式を埋め込むことができます:

const name be ///Alice///
const age be 30
const msg be ///Hello, [name]! You are [age] years old.///

コンパイル結果:

const name = "Alice";
const age = 30;
const msg = `Hello, ${name}! You are ${age} years old.`;

ブラケット内は任意の式を使えます:

const x be 10
const result be ///[x] times 2 is [x mul 2]///

コンパイル結果:

const x = 10;
const result = `${x} times 2 is ${x * 2}`;

文字列内にリテラルの [] を含めたい場合は、エスケープシーケンス \[\] を使います。

const i be 42
const f be 3.14
const a be true
const b be false
const c be null
const d be nil -- nullのエイリアス
const e be undefined

Purusには異なる役割を持つ2つの区切り文字があります:

区切り文字用途JS出力
;関数の引数、パラメータ、分割代入,
,配列の要素、オブジェクトのプロパティ,

どちらもJavaScriptでは , にコンパイルされますが、Purusでは異なる目的で使い分けます:

;関数の引数(呼び出し時)とパラメータ(宣言時)の区切りに使用します:

-- 関数パラメータ
fn add a; b
return a add b
-- 関数の引数
add[1; 2]
console.log[///hello///; ///world///]
Math.max[1; 2; 3]
-- 分割代入
const [a; b; c] be arr
const object[name; age] be person

,配列の要素オブジェクトのプロパティの区切りに使用します:

-- 配列
const arr be [1, 2, 3]
-- オブジェクト
const obj be [name be ///Alice///, age be 30]

なぜ2つの区切り文字があるのか?

Section titled “なぜ2つの区切り文字があるのか?”

Purusでは [] を関数呼び出しと配列の両方に使うため、2つの区切り文字で区別します:

-- `;` は3つの引数を持つ関数呼び出し
fn[a; b; c] -- fn(a, b, c)
-- `,` は3つの要素を持つ配列
[a, b, c] -- [a, b, c]
-- ネストされた呼び出しでは `;` で引数を区切る
outer[inner[x]; y] -- outer(inner(x), y)
const arr be [1, 2, 3]
const arr2 be [1; 2; 3] -- セミコロンも使用可能
const empty be []
const inclusive be [0..5] -- [0, 1, 2, 3, 4, 5]
const exclusive be [0...5] -- [0, 1, 2, 3, 4]

\ プレフィックスと ..(包含)または ...(排他)を使って配列の一部を切り出します:

const numbers be [0, 1, 2, 3, 4, 5, 6]
const middle be numbers[\2..5] -- [2, 3, 4, 5]
const partial be numbers[\2...5] -- [2, 3, 4]

コンパイル結果:

const middle = numbers.slice(2, 5 + 1);
const partial = numbers.slice(2, 5);

スライスに代入することで配列の一部を置換できます:

numbers[\2..4] be [///a///; ///b///; ///c///]
-- numbers は [0, 1, "a", "b", "c", 5, 6] になります

コンパイル結果:

numbers.splice(2, 4 - 2 + 1, "a", "b", "c");

配列から変数に値を取り出します:

const weather be [///Sunny///; ///Rainy///]
const [today; tomorrow] be weather
-- 変数の値を入れ替える
[today; tomorrow] be [tomorrow; today]

コンパイル結果:

const [today, tomorrow] = weather;
[today, tomorrow] = [tomorrow, today];
const obj be [name be ///Alice///, age be 30]
const empty-obj be [be] -- 空のオブジェクト

object[...] を使ってオブジェクトからプロパティを取り出します:

const person be [name be ///Alice///, age be 30]
const object[name; age] be person

コンパイル結果:

const person = { name: "Alice", age: 30 };
const { name, age } = person;

Purusでは関数呼び出し、配列、オブジェクト、グループ化のすべてに [] を使用します。(){} は使いません。

\ を括弧内で使うことで、式による配列オブジェクトアクセスを行います:

const val be arr[\0] -- arr[0]
const item be obj[\key] -- obj[key]
const x be matrix[\i][\j] -- matrix[i][j]

\ プレフィックスにより、関数呼び出しとプロパティアクセスを区別します:

構文意味JS出力
f[x]関数呼び出しf(x)
arr[\x]計算プロパティアクセスarr[x]
arr[\2..4]スライスarr.slice(2,5)

\. でオプショナルチェイニング(JSの ?.)を表現します:

const name be user\.name -- user?.name
const val be obj\.method[1; 2] -- obj?.method(1, 2)

括弧 [...] は複数行にまたがることができます。項目間の改行やインデントは無視されます:

const items be [
1;
2;
3
]
const config be [
host be ///localhost///,
port be 8080
]
fetch[url].then[
fn response
return response.json[]
].catch[
fn err
console.error[err]
]

ブロックはインデントで定義されます(2スペース推奨):

if x gt 0
console.log[///positive///]
else
console.log[///non-positive///]

識別子にはハイフン(-)とアンダースコア(_)を含めることができ、JavaScript出力ではどちらもアンダースコアに変換されます:

const my-variable be 42
-- コンパイル結果: const my_variable = 42;
const my_variable2 be 43
-- コンパイル結果: const my_variable2 = 43;

ハイフンとアンダースコアは互換性があります。my-varmy_var は同じJavaScript変数(my_var)を参照します。JSライブラリとの互換性のため、どちらの形式でも使用できます。

Purusは多くのJavaScript記号を単語に置き換えます。よく使うJavaScriptパターンとPurusの対応表です:

JavaScriptではバッククォートと ${} を使いますが、Purusでは /// 文字列と [] を使います:

-- JavaScript: `Hello, ${name}! You are ${age} years old.`
const msg be ///Hello, [name]! You are [age] years old.///
-- JavaScript: `${a} + ${b} = ${a + b}`
const result be ///[a] + [b] = [a add b]///
const msg = `Hello, ${name}! You are ${age} years old.`;
const result = `${a} + ${b} = ${a + b}`;

JavaScriptの ?? 演算子はPurusでは coal になります:

-- JavaScript: const port = config.port ?? 3000;
const port be config.port coal 3000
-- JavaScript: const name = user?.name ?? "Anonymous";
const name be user\.name coal ///Anonymous///
const port = config.port ?? 3000;
const name = user?.name ?? "Anonymous";

JavaScriptの三項演算子 condition ? a : bif condition then a else b になります:

-- JavaScript: const label = count > 0 ? "items" : "empty";
const label be if count gt 0 then ///items/// else ///empty///
const label = count > 0 ? "items" : "empty";

JavaScriptの ?. はPurusでは \. になります:

-- JavaScript: user?.address?.city
user\.address\.city
-- JavaScript: arr?.[0]
arr\.[\0]
user?.address?.city;
arr?.[0];

JavaScriptの ===eq(または is)、!==neq(または not eq)になります:

-- JavaScript: if (x === 0) {}
if x eq 0
-- ...
-- JavaScript: if (x !== null) {}
if x neq null
-- ...
if (x === 0) {}
if (x !== null) {}

JavaScriptの => アロー関数は fnto(式本体)または fn とインデントブロックになります:

-- JavaScript: const double = (x) => x * 2;
const double be fn x to x mul 2
-- JavaScript: const greet = (name) => { console.log(name); };
const greet be fn name
console.log[name]
const double = (x) => x * 2;
const greet = (name) => {
console.log(name);
};