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

235 lines
7.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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