65 lines
3.0 KiB
Markdown
65 lines
3.0 KiB
Markdown
# フィールド可視性とデリゲーション設計(提案/仕様草案)
|
||
|
||
本書は Nyash 言語の「フィールド可視性」と「デリゲーション(from/override)」の設計をまとめた仕様草案です。実装は段階的に進めます。
|
||
|
||
## 1. フィールド可視性(Blocks)
|
||
- 構文
|
||
```nyash
|
||
box User {
|
||
private { age, passwordHash, internalCache }
|
||
public { name, email, displayName }
|
||
|
||
init { name, email, displayName, age }
|
||
// ... methods ...
|
||
}
|
||
```
|
||
- ルール
|
||
- `private`: box 内のメソッドからのみアクセス可(外部アクセス不可)
|
||
- `public`: 外部から `obj.field` で参照可
|
||
- いずれにも属さないフィールドはエラー(明示主義)
|
||
- `me.field` は可視性に関わらず常に許可(自身の内部)
|
||
- init は現状どおり public(将来 `public/private init` の導入は別途検討)
|
||
- エラー例
|
||
- 外部から `user.age` → Compile/Interpret Error: private field access
|
||
- 親の private フィールド参照 → Error: parent private field not accessible
|
||
|
||
実装フェーズ(予定)
|
||
1. パーサ: `private { ... }` / `public { ... }` の受理、AST/宣言モデルに可視性付与
|
||
2. 解決/実行: 外部アクセス時に public のみ許可、`me.field` は常にOK
|
||
3. MIR/VM: 既存の `RefGet/RefSet` に可視性チェックフックを追加
|
||
|
||
## 2. デリゲーション(from/override)
|
||
目標: ビルトイン/プラグイン/ユーザー定義の全Boxで、同一の書き味(from/override/super呼び出し)を提供しつつ、安全性を担保する。
|
||
|
||
- 基本方針
|
||
- 継承モデルは維持(「委譲の糖衣」ではない)
|
||
- 親の内部フィールドは不可視(private は子からも見えない)
|
||
- メソッド解決規則は統一:子の override → なければ親へ解決
|
||
- 親がビルトイン/プラグインの場合、親メソッド呼び出しは `BoxCall` に lower(ローダ経由)
|
||
|
||
- 書式例
|
||
```nyash
|
||
box MyFile from FileBox {
|
||
override write(x) {
|
||
// 前処理
|
||
from FileBox.write(x)
|
||
// 後処理
|
||
}
|
||
}
|
||
```
|
||
|
||
- 安全性
|
||
- 親の状態は親の実体としてのみ存在(フィールド継承しない)
|
||
- `from Parent.method()` は親タイプ名での明示ディスパッチ(暗黙の内包はしない)
|
||
- MIR では `BoxCall` を生成し、VM/Interpreter はローダへ委譲
|
||
|
||
実装フェーズ(予定)
|
||
1. MIR Lowering: 親がビルトイン/プラグインの `from` を常に `BoxCall` へ(現状踏襲)
|
||
2. VM/Interpreter: 既存どおりローダ委譲(Handle/BoxRef を統一処理)
|
||
|
||
## 3. 参考
|
||
- BoxRef/Handle 仕様: `docs/reference/plugin-system/boxref-behavior.md`
|
||
- nyash.toml v2.1–v2.2: `docs/reference/plugin-system/nyash-toml-v2_1-spec.md`
|
||
- 実装箇所(予定): `src/parser/declarations/box_definition.rs`, `src/core/model.rs`, `src/interpreter/expressions/access.rs`, `src/mir/*`, `src/backend/vm.rs`
|
||
|