Files
hakorune/docs/private/roadmap/phases/phase-20-variant-box/README.md

316 lines
8.6 KiB
Markdown
Raw Normal View History

# Phase 20.X: VariantBox + enum/match実装
**ステータス**: PLANNEDPhase 15.7セルフホスト完了後に開始)
**期間**: 18-27人日4-6週間、1人体制
**前提条件**: Phase 15.7完了、マクロシステム安定化Phase 16暫定版
---
## 🎯 目的
Hakoruneにenum的な表現を追加MIR16維持、Everything-is-Box原則を守る
**設計元**: ChatGPT Pro提案2025-10-08
**分析完了**: ultrathink 4タスク並列分析整合性・代替案・リスク・影響
---
## 📋 実装内容
### Phase 20.6: VariantBox Core3-5人日
**目標**: enum的な表現の最小実装マクロなし
#### タスク
- [ ] **VariantBox実装**2日
```hakorune
box VariantBox {
tag: StringBox // "Some", "None", "Ok", "Err" 等
fields: ArrayBox // 位置引数
birth(tag_str) {
me.tag = new StringBox(tag_str)
me.fields = new ArrayBox()
}
get_tag() { return me.tag }
get_fields() { return me.fields }
is_tag(name) { return me.tag.equals(name) }
field(i) {
if i < 0 || i >= me.fields.len() {
panic("VariantBox.field: index out of bounds")
}
return me.fields.get(i)
}
}
```
- [ ] **EnumSchemaBox実装**1日
```hakorune
static box EnumSchemaBox {
name: StringBox // "Result", "Option" 等
variants: ArrayBox // ["Ok", "Err"]
register_variant(tag, arity) { ... }
validate_variant(variant_box) { ... }
}
```
- [ ] **手動コンストラクタテスト**1日
```hakorune
// apps/tests/variant_basic.hako
local some = new VariantBox("Some")
some.fields.push(42)
if some.is_tag("Some") {
print(some.field(0)) // → 42
}
```
**成果物**:
- `apps/lib/boxes/variant_box.hako` (50-80行)
- `apps/lib/boxes/enum_schema_box.hako` (40-60行)
- `apps/tests/variant_basic.hako` (30-50行)
---
### Phase 20.7: @enumマクロ5-7人日
**目標**: @enum構文でコンストラクタ関数を自動生成
#### タスク
- [ ] **パーサー@enum対応**2日、Rust側
- `src/parser/mod.rs`: @enum構文追加100-150行
- 新AST型: `ASTNode::EnumDeclaration`
- [ ] **@enumマクロ実装**3日、Hakorune側
```hakorune
// ユーザーコード
@enum Result {
Ok(value)
Err(error)
}
// 自動生成(脱糖先):
static box Result {
Ok(value) {
local v = new VariantBox("Ok")
v.fields.push(value)
return v
}
Err(error) {
local v = new VariantBox("Err")
v.fields.push(error)
return v
}
is_ok(r) { return r.is_tag("Ok") }
as_ok(r) { return r.field(0) }
is_err(r) { return r.is_tag("Err") }
as_err(r) { return r.field(0) }
}
```
- [ ] **スモークテスト追加**1日
- `tools/smokes/v2/profiles/quick/core/enum_basic.sh`
**成果物**:
- `src/parser/mod.rs` 変更100-150行
- `apps/macros/enum/enum_macro.hako` (100-150行)
- `apps/macros/enum/README.md`
---
### Phase 20.8: @matchマクロ7-10人日
**目標**: パターンマッチング構文if/else脱糖
#### タスク
- [ ] **パーサー@match対応**3日、Rust側
- `src/parser/mod.rs`: @match構文追加80-120行
- 新AST型: `ASTNode::MatchExpression`
- [ ] **@matchマクロ実装**4日、Hakorune側
```hakorune
// ユーザーコード
@match result {
Ok(v) => console.log(v)
Err(e) => console.error(e)
}
// 脱糖先:
if result.is_tag("Ok") {
local v = result.field(0)
console.log(v)
} else if result.is_tag("Err") {
local e = result.field(0)
console.error(e)
} else {
panic("Non-exhaustive match")
}
```
- [ ] **網羅性チェック(基本版)**2日
- 実行時エラー(`panic("Non-exhaustive match")`
- 静的チェックはPhase 25型パスで追加
**成果物**:
- `src/parser/mod.rs` 変更80-120行
- `apps/macros/match/match_macro.hako` (150-200行)
- `apps/macros/match/README.md`
---
### Phase 20.9: Option/Result enum化3-5人日
**目標**: 既存Option/ResultBoxをVariantBox版に段階移行
#### タスク
- [ ] **VariantBox版Option実装**1日
```hakorune
@enum Option {
Some(value)
None
}
```
- [ ] **VariantBox版Result実装**1日
```hakorune
@enum Result {
Ok(value)
Err(error)
}
```
- [ ] **段階移行計画実施**2日
- 新規コードのみVariantBox版使用
- 既存ResultBox`selfhost/vm/boxes/result_box.hako`)は互換維持
- 3-5ファイル試験移行
**成果物**:
- `apps/lib/boxes/option.hako` (60-80行)
- `apps/lib/boxes/result.hako` (60-80行)
- 移行ガイド: `docs/guides/option-result-migration.md`
---
## 📊 マイルストーン
| Phase | 成果物 | 成功基準 | リスク |
|-------|--------|---------|--------|
| **20.6** | VariantBox Core | 手動コンストラクタで動作 | 🟢 低 |
| **20.7** | @enumマクロ | コンストラクタ自動生成 | 🟡 中(パーサー拡張) |
| **20.8** | @matchマクロ | パターンマッチ動作 | 🟡 中(複雑な脱糖) |
| **20.9** | Option/Result | 既存コード一部移行 | 🟢 低 |
**合計**: 18-27人日4-6週間
---
## ⚠️ 前提条件
### 必須
- ✅ Phase 15.7完了(セルフホスト達成)
- ✅ StringBox/ArrayBox/MapBox安定稼働
- ✅ マクロシステム基本機能Phase 16暫定版で可
### 推奨
- StringBox比較の効率化SymbolBox実装は後回し可能
- パーサー拡張の経験蓄積
---
## 🚨 既知のリスク
### 🔴 クリティカル
1. **SymbolBox未実装**
- 対策: Phase 20.6-20.9は**StringBoxタグ版**で実装
- SymbolBoxインターン機構はPhase 25で追加可能
2. **@構文パーサー拡張**
- 現状: @構文の実装例なし
- 対策: Phase 16で@derive実装時に基盤整備
### 🟡 中程度
3. **網羅性チェック**
- Phase 20では実行時エラーのみ
- 静的チェックはPhase 25型パスで追加
4. **既存コード移行コスト**
- 影響範囲: ResultBox 5箇所のみ現状
- 対策: 段階的移行、互換API維持
---
## 📚 参考資料
### Phase 20設計書
- **[DESIGN.md](./DESIGN.md)** - VariantBox完全設計主要文書
- **[RESULT_BOX_COMPLETE_DESIGN.md](./RESULT_BOX_COMPLETE_DESIGN.md)** - Result<T,E> Box完全設計2025-10-08新規
- **[RESULT_BOX_SUMMARY.md](./RESULT_BOX_SUMMARY.md)** - Result Box 1分サマリー
- **[RESULT_BOX_MIGRATION_PLAN.md](./RESULT_BOX_MIGRATION_PLAN.md)** - Result Box段階移行計画
- **[result_box_v2_reference.hako](./result_box_v2_reference.hako)** - Result Box参照実装467行
### 実装計画書2025-10-08新規
- **[ENUM_MATCH_PROJECT_PLAN.md](./ENUM_MATCH_PROJECT_PLAN.md)** - @enum/@match完全プロジェクト計画12-17日
- 日次タスク詳細、リスク分析、成功基準、ロールバック計画
- **[ENUM_MATCH_QUICK_START.md](./ENUM_MATCH_QUICK_START.md)** - クイックスタートガイド(要約版)
- 3週間スケジュール、重要リスク、日次チェックリスト
### 設計提案元
- ChatGPT Pro提案2025-10-08
- VariantBox設計完全分析ultrathink 4タスク
### 関連Phase
- Phase 16: マクロ革命(@derive実装
- Phase 20.0-20.5: マクロフル機能(基盤整備)
- Phase 25: 型パス(静的網羅性チェック)
### 実装参考
- `apps/macros/loop_normalize_macro.nyash` (393行)
- `apps/macros/if_match_normalize_macro.nyash` (404行)
- `src/macro/pattern.rs` (252行)
- `selfhost/vm/boxes/result_box.hako` (34行、既存実装)
---
## 🎯 Phase 20内の優先順位
```
Phase 20.0-20.3マクロ基盤derivetest← 🔴 P1最優先
Phase 20.6-20.9VariantBox← 🟢 P2推奨
Phase 20.4-20.5Pattern/Quote← 🟡 P3必要時
Python統合Plan B← 🔵 P4長期計画
```
**理由**:
- P1: セルフホストコードの生産性向上に直結
- P2: 型安全性向上(オプショナルだが効果大)
- P3: 複雑マクロ用(必要になってから実装)
- P4: Phase 25以降でも可
---
## 📝 次のアクション
### Phase 15.7完了後すぐ
1. Phase 20.0開始JsonAstBox基盤
2. Phase 20.6設計レビュー
3. VariantBox Core実装開始
### Phase 20.6完了後
1. @enumマクロ設計
2. パーサー@構文拡張計画
3. Phase 20.7実装開始
---
**作成日**: 2025-10-08
**最終更新**: 2025-10-08
**ステータス**: 計画済み、実装待ち