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