================================================================================ Nyash文法改革 - 深い検討結果まとめ 2025-09-03 ================================================================================ 【検討参加者】 - Claude (私) - Gemini先生 - Codex先生 - ユーザー(にゃ) ================================================================================ 1. 現状の問題点 ================================================================================ - 予約語が約30個と多すぎる - CLAUDE.mdとLANGUAGE_REFERENCE_2025.mdで記述が矛盾 - CLAUDE.md: birth > pack > init > Box名形式 - LANGUAGE_REFERENCE_2025.md: init構文に統一 - 「Everything is Box」哲学に反する特殊ケースが多い - 文法が複雑で初学者には分かりにくい ================================================================================ 2. Gemini先生の提案 ================================================================================ 【核心的な提案】 1. birthコンストラクタ採用(Everything is Box哲学に最適) 2. 予約語10個に削減 3. デリゲーションは手動(fromキーワード廃止)→ しかしユーザーから問題指摘 4. 論理演算子は記号化(!, &&, ||) 5. エラーはResult Box(Ok/Err)で統一 【予約語リスト(Gemini案)】 - box, new, me, public, if, loop, break, return, let, import 【問題点】 - fromキーワードの重要な役割を見落としていた 1. デリゲーション宣言: box Child from Parent 2. 親メソッド呼び出し: from Parent.method() ================================================================================ 3. Codex先生の革新的解決策 ================================================================================ 【fromキーワードの扱い】 - fromは残す(文脈的キーワードとして) - 親メソッド呼び出しは :: 記法を使用 - Parent::method() ← 明確で美しい! - 単一親の場合の糖衣構文: from method() 【変数宣言の革新】 - Go風の := 演算子を導入 - x := 10 // 新規宣言 - x = 20 // 既存変数への代入 - letはソフトキーワード(オプション) - let x = 10 は x := 10 の糖衣構文 【その他の最適化】 - overrideを@override属性に変更(予約語削減) - privateキーワード削除(デフォルト非公開) ================================================================================ 4. 最終的な文法提案 ================================================================================ 【予約語(10個のみ!)】 1. box - Box定義 2. new - インスタンス生成 3. me - 自己参照 4. public - 公開指定(デフォルトは非公開) 5. if - 条件分岐 6. loop - ループ 7. break - ループ脱出 8. return - 戻り値 9. import - モジュール読み込み 10. from - デリゲーション宣言 【コンストラクタ】 - birthで統一(Everything is Box哲学を体現) - packはビルトインBox継承専用(将来的に見直し可能) 【変数宣言】 x := 10 // 新規宣言(推奨) let x = 10 // 新規宣言(糖衣構文) x = 20 // 既存変数への代入 【デリゲーション】 box Child from Parent { @override public method() { Parent::method() // 親メソッド呼び出し // または from method() // 単一親の場合の糖衣構文 } } 【可視性】 box SecureBox { // デフォルトで非公開 secret: str internal_state: i64 // 明示的に公開 public id: str // メソッドも同じ process() { } // 非公開 public api() { } // 公開 } 【論理演算子】 - not → ! - and → && - or → || 【エラーハンドリング】 - Result[T, E]型で統一 - Ok(value) / Err(error) - ? 演算子でエラー伝播 ================================================================================ 5. 実装例 ================================================================================ 【基本的なBox定義】 box Calculator from BaseCalculator { // フィールド(デフォルト非公開) count := 0 cache: Map[str, f64] // 公開フィールド public name: str // コンストラクタ public birth(name) { me.name = name me.count = 0 me.cache = new Map[str, f64]() } // 公開メソッド @override public calculate(x, y) { me.count = me.count + 1 // 親メソッド呼び出し result := BaseCalculator::calculate(x, y)? // キャッシュに保存 key := x + "," + y me.cache.set(key, result) return new Ok(result * 2) } // 非公開メソッド clear_cache() { me.cache.clear() } } 【使用例】 calc := new Calculator("MyCalc") result := calc.calculate(10, 20)? print(result) // 60 ================================================================================ 6. 移行ガイド ================================================================================ 【予約語の変更】 - private → 削除(デフォルト非公開) - var → 削除(:= または let を使用) - static → 検討中 - interface → 検討中 - function → 削除(メソッドのみ) - try/catch/throw → Result型 + ? 演算子 - true/false → 検討中(予約語から外す可能性) - not/and/or → !/&&/|| 【構文の変更】 - init() → birth() - from Parent.method() → Parent::method() - override → @override - private field → field(デフォルト) ================================================================================ 7. 未解決の課題 ================================================================================ 1. staticキーワードの扱い - Static Box Mainパターンをどう表現するか 2. interfaceキーワードの扱い - ダックタイピングで十分か? - 構造的部分型で代替可能か? 3. true/falseの扱い - 予約語から外してBoolBoxの定数にするか? 4. asyncの扱い - Task[T]型 + .await()メソッドで十分か? 5. 型アノテーション - : Type 形式で統一でOKか? 6. ジェネリクス - Box[T, E] 形式で統一でOKか? ================================================================================ 8. 次のステップ ================================================================================ 1. この提案をベースに具体的な文法仕様書を作成 2. パーサーへの影響を評価 3. 既存コードの移行計画を立案 4. スモークテストの更新 5. ドキュメント(CLAUDE.md, LANGUAGE_REFERENCE_2025.md)の統一 ================================================================================ 9. 結論 ================================================================================ 予約語を10個に削減し、「Everything is Box」哲学を徹底することで、 シンプルで強力、かつ初学者にも分かりやすい言語を実現できる。 特に重要なのは: - birthコンストラクタ(哲学の体現) - fromキーワードの維持(実用性) - := 演算子の導入(明確な宣言) - デフォルト非公開(安全性) - :: による親メソッド呼び出し(明確性) これらにより、Nyashは本当に「世界一美しい箱」になる。