Files
hakorune/docs/development/roadmap/phases/phase-12.7/archive/grammar-reform-discussion.txt

235 lines
7.4 KiB
Plaintext
Raw Normal View History

================================================================================
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 BoxOk/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は本当に「世界一美しい箱」になる。