106 lines
3.6 KiB
Plaintext
106 lines
3.6 KiB
Plaintext
Nyashプログラミング言語のオーバーライド設計について深い相談です。
|
||
|
||
【現在発見された実装問題】
|
||
現在のNyashでは HashMap::insert により「暗黙のオーバーライド」が発生している:
|
||
```rust
|
||
// instance.rs - add_method関数
|
||
pub fn add_method(&mut self, method_name: String, method_ast: ASTNode) {
|
||
let mut new_methods = (*self.methods).clone();
|
||
new_methods.insert(method_name, method_ast); // ← 同名で上書き!
|
||
self.methods = Arc::new(new_methods);
|
||
}
|
||
```
|
||
|
||
これにより以下が可能になってしまっている:
|
||
```nyash
|
||
box Node {
|
||
send(msg) { // 最初の定義
|
||
print("Version 1")
|
||
}
|
||
|
||
send(msg) { // 暗黙に上書きされる
|
||
print("Version 2") // ← こちらだけが残る
|
||
}
|
||
}
|
||
```
|
||
|
||
【Nyashの設計哲学との矛盾】
|
||
- **明示性重視**: 何が起きているかを隠さない
|
||
- **Everything is Box**: 統一された世界観
|
||
- **from デリゲーション**: `from Parent.method()` の明示的呼び出し
|
||
- **初学者フレンドリー**: 複雑な概念を分かりやすく表現
|
||
|
||
【提案する修正方針】
|
||
|
||
**1. 暗黙のオーバーライドを完全禁止**
|
||
```nyash
|
||
box Node {
|
||
send(msg) {
|
||
print("Version 1")
|
||
}
|
||
|
||
send(msg) { // ← コンパイルエラーにする
|
||
print("Version 2")
|
||
}
|
||
}
|
||
// Error: Method 'send' is already defined. Use 'override' keyword if intentional.
|
||
```
|
||
|
||
**2. コンストラクタのオーバーロード禁止**
|
||
```nyash
|
||
box Node {
|
||
constructor(id) {
|
||
me.id = id
|
||
}
|
||
|
||
constructor(id, name) { // ← エラーにする
|
||
me.id = id
|
||
me.name = name
|
||
}
|
||
}
|
||
// Error: Constructor overloading is not allowed. Use explicit initialization.
|
||
```
|
||
|
||
**3. デリゲーションでの明示的override**
|
||
```nyash
|
||
box MeshNode : P2PBox {
|
||
// 明示的にオーバーライドする意図を示す
|
||
override send(intent, data, target) {
|
||
me.routing.log(target)
|
||
from P2PBox.send(intent, data, target) // 親の実装も呼べる
|
||
}
|
||
|
||
// 新しいメソッド(overrideなし)
|
||
sendWithRetry(intent, data, target) {
|
||
// 新機能
|
||
}
|
||
}
|
||
```
|
||
|
||
**4. エラーメッセージの改善**
|
||
- 重複定義時: "Method 'send' already exists. Use 'override' if you want to replace parent method."
|
||
- override不正使用時: "Method 'newMethod' does not exist in parent. Remove 'override' keyword."
|
||
|
||
【深く考えてほしい点】
|
||
|
||
**1. 哲学的整合性**
|
||
- この方針はNyashの「明示性重視」「Everything is Box」哲学と整合しますか?
|
||
- `from Parent.method()` デリゲーション設計との相性は?
|
||
|
||
**2. 学習コスト vs 安全性**
|
||
- `override` キーワード追加による学習コストは妥当ですか?
|
||
- 暗黙のオーバーライド禁止により、どの程度安全性が向上しますか?
|
||
|
||
**3. デリゲーションとの関係**
|
||
- デリゲーション先メソッドを `override` するのは自然ですか?
|
||
- 多重デリゲーション時の `override` はどう扱うべきですか?
|
||
|
||
**4. 実装上の課題**
|
||
- コンパイル時の重複チェック実装の複雑度は?
|
||
- 既存コードへの影響と移行戦略は?
|
||
|
||
**5. 他言語との比較優位性**
|
||
- Java/C#の `@Override` や TypeScript の `override` との違いは?
|
||
- Nyashならではの独自価値は何ですか?
|
||
|
||
プログラミング言語設計の専門的視点から、この方針がNyashの目指す「明示的で安全、かつ初学者フレンドリーな言語」に最適かどうか深く分析してください。 |