316 lines
8.6 KiB
Markdown
316 lines
8.6 KiB
Markdown
|
|
# Phase 20.X: VariantBox + enum/match実装
|
|||
|
|
|
|||
|
|
**ステータス**: PLANNED(Phase 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 Core(3-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(マクロ基盤+derive+test)← 🔴 P1(最優先)
|
|||
|
|
↓
|
|||
|
|
Phase 20.6-20.9(VariantBox)← 🟢 P2(推奨)
|
|||
|
|
↓
|
|||
|
|
Phase 20.4-20.5(Pattern/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
|
|||
|
|
**ステータス**: 計画済み、実装待ち
|