150 lines
3.7 KiB
Markdown
150 lines
3.7 KiB
Markdown
|
|
# 🎯 Nyash デリゲーション設計サマリー
|
|||
|
|
|
|||
|
|
作成日: 2025年8月10日
|
|||
|
|
状態: 設計完了・実装待ち
|
|||
|
|
|
|||
|
|
## 🎉 決定事項
|
|||
|
|
|
|||
|
|
### **基本方針**
|
|||
|
|
- ✅ **継承完全廃止** → デリゲーション全面移行
|
|||
|
|
- ✅ **Everything is Box哲学維持**
|
|||
|
|
- ✅ **明示性重視の文法**
|
|||
|
|
|
|||
|
|
### **最終採用文法**
|
|||
|
|
```nyash
|
|||
|
|
// 基本形式(80%のケース)
|
|||
|
|
box MeshNode extends P2PBox {
|
|||
|
|
init routing = RoutingTable()
|
|||
|
|
|
|||
|
|
constructor(nodeId, world) {
|
|||
|
|
super(nodeId, world) // super解禁!
|
|||
|
|
me.routing = RoutingTable()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override send(intent, data, target) {
|
|||
|
|
me.routing.log(target)
|
|||
|
|
super.send(intent, data, target) // 直感的
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 複数デリゲーション(20%のケース)
|
|||
|
|
box ComplexNode extends P2PBox {
|
|||
|
|
init cache = CacheBox()
|
|||
|
|
|
|||
|
|
delegates cache // 追加デリゲーション
|
|||
|
|
|
|||
|
|
override send(intent, data, target) {
|
|||
|
|
me.cache.store(intent, data)
|
|||
|
|
super.send(intent, data, target)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🌟 3AI大会議結果
|
|||
|
|
|
|||
|
|
### **参加者**
|
|||
|
|
- 🤖 Claude(司会・バランス調整)
|
|||
|
|
- 🌟 Gemini(ユーザー体験重視)
|
|||
|
|
- 💻 ChatGPT(技術実装重視)
|
|||
|
|
|
|||
|
|
### **提案比較**
|
|||
|
|
| 提案者 | 文法 | 特徴 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| Gemini | `delegates to self.pos` | シンプル・直感的 |
|
|||
|
|
| ChatGPT | `delegate repo exposes API` | 細かい制御・柔軟性 |
|
|||
|
|
| **採用案** | `extends` + `super` | 馴染みやすさ・学習コスト最小 |
|
|||
|
|
|
|||
|
|
## 🚀 実装すべき機能
|
|||
|
|
|
|||
|
|
### **Phase 1: 基本デリゲーション(最優先)**
|
|||
|
|
```nyash
|
|||
|
|
box SimpleWrapper extends SomeBox {
|
|||
|
|
constructor(args) {
|
|||
|
|
super(args) // 基底初期化
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override method() {
|
|||
|
|
super.method() // 元実装呼び出し
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### **Phase 2: 複数デリゲーション(中期)**
|
|||
|
|
```nyash
|
|||
|
|
box ComplexWrapper extends PrimaryBox {
|
|||
|
|
init secondary = SecondaryBox()
|
|||
|
|
|
|||
|
|
delegates secondary
|
|||
|
|
delegates tertiary only { save, load } // 選択的
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🛠️ 実装方針
|
|||
|
|
|
|||
|
|
### **内部実装**
|
|||
|
|
- `extends`は実際にはデリゲーション
|
|||
|
|
- `super`は内部フィールドへの参照
|
|||
|
|
- 自動メソッド転送生成
|
|||
|
|
|
|||
|
|
### **ASTノード追加**
|
|||
|
|
```rust
|
|||
|
|
// ASTに追加すべき要素
|
|||
|
|
BoxDeclaration {
|
|||
|
|
extends: Option<String>, // extends PrimaryBox
|
|||
|
|
delegates: Vec<String>, // delegates field1, field2
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// superキーワード対応
|
|||
|
|
SuperCall {
|
|||
|
|
method: String,
|
|||
|
|
arguments: Vec<Expression>,
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📈 期待効果
|
|||
|
|
|
|||
|
|
### **NyaMeshライブラリでの改善**
|
|||
|
|
```nyash
|
|||
|
|
// Before: 20行以上の手動ラッピング
|
|||
|
|
box MeshNode {
|
|||
|
|
// 全メソッド手動転送...
|
|||
|
|
send(...) { return me.p2p.send(...) }
|
|||
|
|
broadcast(...) { return me.p2p.broadcast(...) }
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// After: 5行程度
|
|||
|
|
box MeshNode extends P2PBox {
|
|||
|
|
override send(intent, data, target) {
|
|||
|
|
me.routing.log(target)
|
|||
|
|
super.send(intent, data, target)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**改善率**: 75%以上のコード削減
|
|||
|
|
|
|||
|
|
## 🎯 次のステップ
|
|||
|
|
|
|||
|
|
### **実装優先度**
|
|||
|
|
1. 🔥 **`extends`構文追加**(パーサー・AST)
|
|||
|
|
2. 🔥 **`super`キーワード解禁**(インタープリター)
|
|||
|
|
3. 🔥 **自動メソッド転送**(メソッド解決)
|
|||
|
|
4. 🟡 **複数delegates**(将来拡張)
|
|||
|
|
|
|||
|
|
### **技術的課題**
|
|||
|
|
- [ ] ASTにextends/super追加
|
|||
|
|
- [ ] superの型チェック・安全性
|
|||
|
|
- [ ] メソッド転送の実装
|
|||
|
|
- [ ] テストスイート作成
|
|||
|
|
|
|||
|
|
## 📝 設計哲学
|
|||
|
|
|
|||
|
|
> 「継承の表現力を、デリゲーションの安全性で実現する」
|
|||
|
|
|
|||
|
|
- **見た目は継承**:学習コストを最小化
|
|||
|
|
- **実装はデリゲーション**:安全性を確保
|
|||
|
|
- **Everything is Box**:一貫した設計哲学
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
**次回作業開始時の参照用サマリー完了** 🎉
|