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