構文の概要
ファイル拡張子
Section titled “ファイル拡張子”| 拡張子 | 出力 | 説明 |
|---|---|---|
.purus | .js | 標準JavaScript |
.cpurus | .cjs | CommonJSモジュール |
.mpurus | .mjs | ESモジュール |
-- これは行コメントです
--- これはブロックコメントです ---文字列はトリプルスラッシュ /// で囲みます:
const greeting be ///Hello, World///エスケープシーケンス
Section titled “エスケープシーケンス”| エスケープ | 結果 |
|---|---|
\n | 改行 |
\t | タブ |
\\ | バックスラッシュ |
\/ | / |
\[ | [(リテラルブラケット) |
\] | ](リテラルブラケット) |
文字列補間(テンプレートリテラル)
Section titled “文字列補間(テンプレートリテラル)”文字列内で [式] を使い、式を埋め込むことができます:
const name be ///Alice///const age be 30const 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 10const result be ///[x] times 2 is [x mul 2]///コンパイル結果:
const x = 10;const result = `${x} times 2 is ${x * 2}`;文字列内にリテラルの [ や ] を含めたい場合は、エスケープシーケンス \[ と \] を使います。
const i be 42const f be 3.14真偽値とnull
Section titled “真偽値とnull”const a be trueconst b be falseconst c be nullconst d be nil -- nullのエイリアスconst e be undefined区切り文字: ; と ,
Section titled “区切り文字: ; と ,”Purusには異なる役割を持つ2つの区切り文字があります:
| 区切り文字 | 用途 | JS出力 |
|---|---|---|
; | 関数の引数、パラメータ、分割代入 | , |
, | 配列の要素、オブジェクトのプロパティ | , |
どちらもJavaScriptでは , にコンパイルされますが、Purusでは異なる目的で使い分けます:
; — 引数とパラメータ
Section titled “; — 引数とパラメータ”; は関数の引数(呼び出し時)とパラメータ(宣言時)の区切りに使用します:
-- 関数パラメータ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 arrconst object[name; age] be person, — データの区切り
Section titled “, — データの区切り”, は配列の要素とオブジェクトのプロパティの区切りに使用します:
-- 配列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]スライス(切り出し)
Section titled “スライス(切り出し)”\ プレフィックスと ..(包含)または ...(排他)を使って配列の一部を切り出します:
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);スプライス(部分置換)
Section titled “スプライス(部分置換)”スライスに代入することで配列の一部を置換できます:
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];オブジェクト
Section titled “オブジェクト”const obj be [name be ///Alice///, age be 30]const empty-obj be [be] -- 空のオブジェクトオブジェクト分割代入
Section titled “オブジェクト分割代入”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;括弧は[]のみ
Section titled “括弧は[]のみ”Purusでは関数呼び出し、配列、オブジェクト、グループ化のすべてに [] を使用します。() や {} は使いません。
計算プロパティアクセス
Section titled “計算プロパティアクセス”\ を括弧内で使うことで、式による配列オブジェクトアクセスを行います:
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) |
オプショナルチェイニング
Section titled “オプショナルチェイニング”\. でオプショナルチェイニング(JSの ?.)を表現します:
const name be user\.name -- user?.nameconst 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-var と my_var は同じJavaScript変数(my_var)を参照します。JSライブラリとの互換性のため、どちらの形式でも使用できます。
JavaScript との比較
Section titled “JavaScript との比較”Purusは多くのJavaScript記号を単語に置き換えます。よく使うJavaScriptパターンとPurusの対応表です:
テンプレートリテラル (${})
Section titled “テンプレートリテラル (${})”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}`;Null合体 (??)
Section titled “Null合体 (??)”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";三項演算子 (? :)
Section titled “三項演算子 (? :)”JavaScriptの三項演算子 condition ? a : b は if 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";オプショナルチェイニング (?.)
Section titled “オプショナルチェイニング (?.)”JavaScriptの ?. はPurusでは \. になります:
-- JavaScript: user?.address?.cityuser\.address\.city
-- JavaScript: arr?.[0]arr\.[\0]user?.address?.city;arr?.[0];厳密等価 (=== / !==)
Section titled “厳密等価 (=== / !==)”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) {}アロー関数 (=>)
Section titled “アロー関数 (=>)”JavaScriptの => アロー関数は fn … to(式本体)または 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);};