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

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日

    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日

    static box EnumSchemaBox {
        name: StringBox              // "Result", "Option" 等
        variants: ArrayBox           // ["Ok", "Err"]
    
        register_variant(tag, arity) { ... }
        validate_variant(variant_box) { ... }
    }
    
  • 手動コンストラクタテスト1日

    // 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側

    // ユーザーコード
    @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側

    // ユーザーコード
    @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日

    @enum Option {
        Some(value)
        None
    }
    
  • VariantBox版Result実装1日

    @enum Result {
        Ok(value)
        Err(error)
    }
    
  • 段階移行計画実施2日

    • 新規コードのみVariantBox版使用
    • 既存ResultBoxselfhost/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実装時に基盤整備

🟡 中程度

  1. 網羅性チェック

    • Phase 20では実行時エラーのみ
    • 静的チェックはPhase 25型パスで追加
  2. 既存コード移行コスト

    • 影響範囲: ResultBox 5箇所のみ現状
    • 対策: 段階的移行、互換API維持

📚 参考資料

Phase 20設計書

実装計画書2025-10-08新規

  • ENUM_MATCH_PROJECT_PLAN.md - @enum/@match完全プロジェクト計画12-17日
    • 日次タスク詳細、リスク分析、成功基準、ロールバック計画
  • 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 ステータス: 計画済み、実装待ち