Files
hakorune/docs/reference/language/LANGUAGE_REFERENCE_2025.md
Selfhosting Dev 45e1d57536 docs(lang): adopt match as unified pattern matching; remove peek from docs; update EBNF and guides
- Decision recorded in CURRENT_TASK: replace  with  (no compat alias)
- EBNF: add match_expr/pattern/guard; note legacy peek removal
- Guides/Reference: update examples and wording (null-coalesce/safe-access sugar via match)
2025-09-19 07:42:38 +09:00

21 KiB
Raw Blame History

🚀 Nyash Language Reference 2025

最終更新: 2025年9月18日 - Property System Revolution + Method-Level Exception Handling

📖 概要

Nyashは「Everything is Box」哲学に基づく革新的プログラミング言語です。 Rust製インタープリターによる高性能実行と、直感的な構文により、学習しやすく実用的な言語として完成しました。


🔤 1. 予約語・キーワード完全リスト

Phase 15で確定した17個の予約語

予約語 用途
box クラス定義 box MyClass { }
new オブジェクト生成 new ConsoleBox()
me 自己参照thisの代わり me.field = value
local ローカル変数宣言 local x, y = 10
return 関数リターン return value
from デリゲーション・親メソッド呼び出し box Child from Parent / from Parent.method()
birth コンストラクタ(統一名) birth(param) { }
static 静的Box・関数定義 static box Main { }
if 条件分岐 if condition { }
else else節 else { }
loop ループ(唯一の形式) loop(condition) { }
continue ループ継続 continue
match パターンマッチング(構造/型/ガード) match value { "A" => 1, _ => 0 }
try 例外捕獲開始 try { }
interface インターフェース定義 interface Comparable { }
once NEW 遅延評価プロパティ once cache: CacheBox { build() }
birth_once NEW 即座評価プロパティ birth_once config: ConfigBox { load() }

その他の重要キーワード(予約語ではない)

キーワード 用途
override 明示的オーバーライド override speak() { }
break ループ脱出 break
catch 例外処理 catch (e) { }
cleanup 最終処理finally の後継) cleanup { }
throw 例外発生 throw error
nowait 非同期実行 nowait future = task()
await 待機・結果取得 result = await future
include ファイル取り込み include "math.nyash"
print 出力(デバッグ用) print("Hello")
function/fn 関数定義 fn add(a,b) { }
init 初期化ブロック init { field1, field2 }
pack 旧コンストラクタ(互換性) pack(param) { }
outbox 所有権移転変数 outbox result = compute()
global グローバル変数 global CONFIG = "dev"
weak 弱参照修飾子 weak reference
using 名前空間インポート using namespace

演算子・論理

演算子/キーワード 用途
not 論理否定 not condition
and 論理積 a and b
or 論理和 a or b
true/false 真偽値 flag = true
null null値 value = null

📝 2. 文法・構文仕様

2.1 Box定義文法

基本Box

box ClassName {
    # フィールド宣言Phase 12.7形式)
    field1: TypeBox              # フィールド型アテーションP0では無視
    field2: TypeBox
    field3                       # 型なしも可
    
    # コンストラクタ
    birth(param1, param2) {      # birth構文に統一
        me.field1 = param1
        me.field2 = param2
        me.field3 = defaultValue()
    }
    
    # メソッド
    methodName(arg1, arg2) {
        return me.field1 + arg1
    }
    
    # デストラクタfini
    fini() {
        print("Cleanup: " + me.field1)
    }
}

デリゲーションBox

box Child from Parent interface Comparable {
    childField: TypeBox          # 追加フィールド
    
    birth(parentParam, childParam) {  # birth構文に統一
        from Parent.birth(parentParam)  # 親コンストラクタ明示呼び出し
        me.childField = childParam
    }
    
    # メソッドオーバーライド
    override process(data) {     # overrideキーワード必須
        local result = from Parent.process(data)  # 親メソッド呼び出し
        return result + " (Child processed)"
    }
    
    # インターフェース実装
    compareTo(other) {
        return me.value - other.value
    }
}

Static Box推奨エントリーポイント

static box Main {
    console: ConsoleBox
    result: IntegerBox
    
    main() {
        me.console = new ConsoleBox()
        me.console.log("🎉 Everything is Box!")
        return "Success"
    }
}

2.2 変数宣言

基本パターン

# 単一宣言
local x
local name = "初期値"

# 複数宣言
local a, b, c
local x = 10, y = 20, z  # 混合初期化

# 所有権移転static関数内
static function Factory.create() {
    outbox product  # 呼び出し側に所有権移転
    product = new Item()
    return product
}

変数宣言厳密化システム2025-08-09実装

# ✅ 正しい - 明示宣言必須
local temp
temp = 42

# ❌ エラー - 未宣言変数への代入
x = 42  # RuntimeError: 未宣言変数 + 修正提案表示

2.3 制御構文

条件分岐

if condition {
    # 処理
} else if condition2 {
    # 処理2  
} else {
    # else処理
}

ループ(統一構文)

# ✅ 唯一の正しい形式
loop(condition) {
    # ループ本体
    if exitCondition {
        break
    }
    if skipCondition {
        continue  # Phase 12.7で追加
    }
}

# ❌ 削除済み - 使用不可
while condition { }  # パーサーエラー
loop() { }          # パーサーエラー

Peek式Phase 12.7で追加)

# パターンマッチング風の分岐
local result = match value {
    "A" => 100,
    "B" => 200,
    "C" => 300,
    else => 0  # else必須
}

# 文の形式も可
match status {
    "error" => {
        print("Error occurred")
        return null
    },
    "success" => {
        print("All good")
    },
    else => {
        print("Unknown status")
    }
}

2.4 演算子・式

🚀 新実装: 関数オーバーロードシステム

# Rust風トレイトベース演算子2025-08-10実装完了
sum = 10 + 20           # IntegerBox + IntegerBox = IntegerBox
concat = "Hi" + " !"    # StringBox + StringBox = StringBox  
repeat = "Ha" * 3       # StringBox * IntegerBox = "HaHaHa"
mixed = 42 + " answer"  # 混合型 → 自動文字列結合フォールバック

演算子優先順位

result = a + b * c / d - e    # 算術演算子は標準的優先順位
logic = not a and b or c      # not > and > or
compare = (x > y) and (z <= w)  # 比較は括弧推奨

論理演算子

# キーワード版(推奨)
canAccess = level >= 5 and hasKey
isValid = not (isEmpty or hasError)

# シンボル版(互換)
result = condition && other || fallback  # 利用可能だが非推奨

特殊演算子Phase 12.7実装済み)

# ? 演算子 - Result伝播
local data = readFile(path)?  # エラーなら早期return

# ラムダ式
local add = fn(x, y) { return x + y }
local double = fn(x) { x * 2 }  # 単一式なら省略可

# await式  

### **2.5 プロパティ(統一メンバ — Phase 15、既定ON: NYASH_ENABLE_UNIFIED_MEMBERS**

概要
- Box 内のメンバを「格納/計算/一度だけ(遅延 or 生成時」で統一的に扱います。JSON v0/MIR は変更せず、ローワで既存の slot/method に展開します。
- 環境変数 `NYASH_ENABLE_UNIFIED_MEMBERS` で制御Phase 15 では既定ON、`0/false/off` で無効化)。

分類と構文headerfirst
- stored格納・読み書き可
  - `name: Type` または `name: Type = expr`(初期値は生成時に一度だけ評価)
- computed計算・読み専用
  - `name: Type { /* body */ }`(読むたびに計算。代入不可)
- once初回アクセス時に一度だけ計算 → 以後は保存値)
  - `once name: Type { /* body */ }` または `once name: Type => expr`
- birth_once生成時に一度だけ計算 → 以後は保存値)
  - `birth_once name: Type { /* body */ }` または `birth_once name: Type => expr`

nyashモードblockfirst、オプション
- `{"..."}` の直後に `as` を置く統一構文を、Box メンバ領域で受理
  - computed: `{ body } as name: Type`
  - once: `{ body } as once name: Type`
  - birth_once: `{ body } as birth_once name: Type`
  - stored は blockfirst では宣言しないheaderfirst を使用)

共通ルール
- 読みは全て `obj.name` で同一表記。違いは書き込み可否と計算タイミングのみ。
- 代入:
  - stored のみ許可(`obj.name = v`)。
  - computed/once/birth_once は代入不可エラー。setter を定義した場合のみ糖衣で許可(`obj.name = v` → `__set_name(v)`)。

例
```nyash
box MyBox {
  name: StringBox                 # stored
  size: IntegerBox { me.items.len() }   # computed
  once cache: CacheBox { buildCache() } # once
  birth_once token: StringBox { readEnv("TOKEN") } # eager once
}

例外・ハンドラStage3, NYASH_PARSER_STAGE3=1

  • stored 以外のブロック末尾に catch/cleanup を付与可能headerfirst / blockfirst 両対応)。
    • computed: name: T { body } catch(e) { ... } cleanup { ... }
    • once: once name: T { body } catch { ... } cleanup { ... }
    • birth_once: birth_once name: T { body } catch { ... } cleanup { ... }
  • once の例外ポリシーcatch が無い場合): 例外をその場で伝播し、プロパティは poison 状態となり以後の読みでも同じ例外を再スロー(再実行しない)。
  • birth_once の実行順: ユーザ birth 本体の前、宣言順で実行。未捕捉例外はコンストラクタ失敗として伝播。自己参照はエラー。相互依存の循環は検出してエラー。

ローワ(下ろし先の概要)

  • stored → slot初期化子は生成時に一度だけ評価
  • computed → __get_name():T メソッドを合成し、obj.name 読みを呼び出しに解決。
  • once → __name: Option<T> + __get_name()(初回のみ評価・保存)。未捕捉例外で poison し、以後は即 rethrow。
  • birth_once → __name: T を用意し、birth 直前に宣言順で初期化コードを挿入。未捕捉例外は new 失敗。

注意

  • JSON v0 は unchanged。Unified Members はパーサ/ローワの砂糖として振る舞います。
  • stored の初期化子は式のみ(catch/cleanup は不可)。 local result = await asyncTask()

---

## 🏗️ **3. Box構文詳細ガイド**

### **3.1 Everything is Box 原則**

```nyash
# すべての値がBox
number = 42               # IntegerBox
text = "hello"           # StringBox
flag = true              # BoolBox
array = new ArrayBox()   # ArrayBox
console = new ConsoleBox() # ConsoleBox

# 統一的なメソッド呼び出し
print(number.to_string_box().value)  # "42"
print(array.length())               # 配列長
console.log("Everything is Box!")   # コンソール出力

3.2 コンストラクタパターン

パラメータ付きコンストラクタ

box Person {
    public name: StringBox
    public email: StringBox
    private age: IntegerBox
    
    birth(personName, personAge) {  # birth構文に統一
        me.name = personName
        me.age = personAge  
        me.email = me.name + "@example.com"  # 計算フィールド
    }
    
    # ファクトリーメソッド
    static createGuest() {
        outbox guest
        guest = new Person("Guest", 0)
        return guest
    }
}

# 使用例
person = new Person("Alice", 25)
guest = Person.createGuest()

3.3 継承とインターフェース

デリゲーションチェーン

# 基底Box
box Animal {
    public name: StringBox
    public species: StringBox
    
    birth(animalName, animalSpecies) {
        me.name = animalName
        me.species = animalSpecies
    }
    
    speak() {
        return me.name + " makes a sound"
    }
}

# デリゲーション
box Dog from Animal {
    breed: StringBox  # 追加フィールド
    
    birth(dogName, dogBreed) {
        from Animal.birth(dogName, "Canine")  # 親コンストラクタ呼び出し
        me.breed = dogBreed
    }
    
    override speak() {  # 明示的オーバーライド
        return me.name + " barks: Woof!"
    }
}

# インターフェース実装
box Cat from Animal interface Playful {
    # Playfulインターフェースの実装必須
}

3.4 Static Boxパターン

名前空間・ユーティリティ

static box MathUtils {
    PI: FloatBox
    E: FloatBox
    
    # 注意: static初期化ブロックは未実装
    # 初期化はメソッド内で行う
    
    add(a, b) {
        return a + b
    }
    
    circleArea(radius) {
        # 初回アクセスで初期化パターン
        if me.PI == null {
            me.PI = 3.14159265
        }
        return me.PI * radius * radius
    }
}

# 使用法
area = MathUtils.circleArea(5)
sum = MathUtils.add(10, 20)

アプリケーションエントリーポイント

# 🎯 推奨: Static Box Main パターン
static box Main {
    console: ConsoleBox
    result: IntegerBox
    
    main() {
        me.console = new ConsoleBox()
        me.console.log("🚀 Starting application...")
        
        # アプリケーションロジック
        me.result = processData()
        
        return "Application completed successfully"
    }
}

🚀 4. 最新機能・革新技術

4.1 Arc Revolution2025-08-10

# 全16種類のBox型が統一Arc<Mutex>パターンで実装
# 完全なスレッドセーフティと高性能を両立

array = new ArrayBox()
array.push(10)           # スレッドセーフな追加
array.push(20)
item = array.get(0)      # スレッドセーフな取得

json = new JSONBox()
json.set("name", "Alice")    # 並行安全な操作
data = json.stringify()      # JSON文字列化

4.2 Rust風トレイトベース演算子2025-08-10

# AI大相談会で決定された最適設計
# 静的・動的ハイブリッドディスパッチによる高性能実現

# 整数演算
result = 100 - 25        # IntegerBox間演算 → IntegerBox
product = 6 * 7          # 高速静的ディスパッチ

# 文字列操作  
greeting = "Hello" + " World"    # 文字列結合
repeated = "Echo" * 3            # "EchoEchoEcho"

# 混合型フォールバック
message = "Answer: " + 42        # "Answer: 42"

# Boolean演算
boolSum = true + false           # 1 (IntegerBox)

4.3 変数宣言厳密化2025-08-09

# メモリ安全性・非同期安全性保証システム

static box Calculator {
    private memory: ArrayBox  # 必須フィールド宣言
    
    calculate() {
        local temp       # 必須ローカル変数宣言
        temp = me.memory * 2
        return temp
    }
}

🚀 4.4 Phase 12.7実装済み機能

Peek式 - パターンマッチング風分岐

# 式として使用(値を返す)
local grade = match score {
    100 => "Perfect",
    90 => "Excellent", 
    80 => "Good",
    _ => "Needs improvement"
}

# 文として使用(アクション実行)
match command {
    "save" => {
        saveFile()
        print("Saved!")
    },
    "quit" => {
        cleanup()
        return
    },
    _ => print("Unknown command")
}

Continue文

loop(i < 100) {
    if i % 2 == 0 {
        continue  # 偶数をスキップ
    }
    process(i)
}

フィールド型アノテーション

box Person {
    name: StringBox      # 型情報を明記P0では無視
    age: IntegerBox
    email               # 型なしも可
}

?演算子Result伝播

# ResultBoxのエラーを自動的に早期return
local data = readFile("config.json")?
local parsed = parseJSON(data)?
return parsed.get("version")

Lambda式

# 基本形
local add = fn(x, y) { return x + y }

# 単一式の場合returnは省略可
local double = fn(x) { x * 2 }

# 高階関数での使用
array.map(fn(x) { x * x })

5. 実装済みBox型ライブラリ

5.1 基本型

  • StringBox - 文字列split, find, replace, trim等
  • IntegerBox - 64bit整数
  • FloatBox - 64bit浮動小数点数
  • BoolBox - 真偽値
  • NullBox - null値
  • VoidBox - void値

5.2 コレクション

  • ArrayBox - 動的配列push, pop, get, set, join等
  • MapBox - 連想配列・辞書

5.3 システム・I/O

  • ConsoleBox - コンソール入出力
  • DebugBox - デバッグ支援・メモリ追跡
  • FileBox - ファイルシステム操作(プラグイン)

5.4 数学・時間

  • MathBox - 数学関数sin, cos, log, sqrt等
  • TimeBox - 時刻操作・タイマー
  • RandomBox - 乱数生成・選択・シャッフル

5.5 データ処理

  • JSONBox - JSON解析・生成parse, stringify, get, set
  • RegexBox - 正規表現test, find, replace, split
  • BufferBox - バイナリデータ処理
  • StreamBox - ストリーム処理

5.6 ネットワーク・Web

  • HttpClientBox - HTTP通信プラグイン
  • WebDisplayBox - HTML表示WASM
  • WebConsoleBox - ブラウザコンソールWASM
  • WebCanvasBox - Canvas描画WASM

5.7 GUI・マルチメディア

  • EguiBox - デスクトップGUIWindows/Linux、プラグイン
  • SoundBox - 音声再生

5.8 特殊用途

  • FutureBox - 非同期処理結果
  • ResultBox - エラー処理Ok/Err
  • TokenBox - キャンセルトークン
  • FunctionBox - 第一級関数
  • P2PBox - P2P通信プラグイン

🎯 6. パフォーマンス・デザイン原則

6.1 メモリ安全性

  • Rust所有権システムによる完全なメモリ安全性
  • Arcによるスレッドセーフな共有状態管理
  • 自動参照カウント + 明示的デストラクタfini

6.2 実行効率

  • 統一されたBox型システムによる最適化
  • 静的・動的ハイブリッドディスパッチで高速演算
  • パーサー無限ループ対策(--debug-fuel

6.3 開発効率

  • 変数宣言厳密化による早期エラー検出
  • 包括的デバッグ機能DebugBox
  • 直感的な"Everything is Box"概念

📚 7. 学習パス・ベストプラクティス

7.1 初心者向け学習順序

  1. 基本概念: Everything is Box哲学理解
  2. 基本構文: 変数宣言・制御構文・演算子
  3. Box定義: 基本的なクラス作成
  4. Static Box Main: アプリケーションエントリーポイント
  5. 継承・インターフェース: オブジェクト指向機能

7.2 推奨コーディングスタイル

# ✅ 推奨スタイル
static box Main {
    public console: ConsoleBox    # 公開フィールド明示
    public result: IntegerBox
    
    main() {
        me.console = new ConsoleBox()
        
        local data              # 変数事前宣言
        data = processInput()
        
        me.result = data        # 明確な代入
        return "Success"
    }
}

7.3 よくある間違いと対策

# ❌ よくある間違い
public { field1 field2 }    # 旧構文 → 使用不可
x = 42                      # 変数未宣言 → ランタイムエラー
while condition { }         # 非対応構文 → パーサーエラー
this.field                  # thisは使用不可 → me.fieldを使用

# ✅ 正しい書き方Phase 12.7後)
field1: TypeBox             # フィールド宣言(型は省略可)
field2                      # 型なしフィールド
local x = 42               # 事前宣言必須
loop(condition) { }        # 統一ループ構文
me.field                   # self参照はmeのみ

📌 8. 糖衣構文Phase 12.7-B

実装済み(ゲート: NYASH_SYNTAX_SUGAR_LEVEL=basic|full

# パイプライン
result = data |> normalize() |> transform() |> process

# セーフアクセス + デフォルト
name = user?.profile?.name ?? "guest"

# 複合代入
x += 1; y *= 2

# 範囲(内部的には Range(a,b)
loop(i in 1 .. 5) { /* ... */ }

拡張(段階適用予定・設計済み)

let {x, y} = point
let [first, second, ...rest] = array

🎉 Nyash 2025は、AI協働設計による最先端言語システムとして、シンプルさと強力さを完全に両立しました。

最終更新: 2025年9月4日 - Phase 12.7実装済み機能の正確な反映