Files
hakorune/docs/private/roadmap/phases/phase-20-macro-full-features

Phase 20: マクロシステムフル機能実装(セルフホスティング後)

Date: 2025-10-06 Status: PLANNED - セルフホスティング完了後に開始 Prerequisite: Phase 15.7完了(セルフホスティング実現)

🎯 目的

Phase 16でRust実装したマクロシステムのフル機能を、Hakoruneでセルフホスト実装に書き直す。

📋 背景

現状2025-10-06

  • Phase 16でRust実装完了2025-09-19
  • バグ発見: フル機能にバグあり
  • 暫定対応: ChatGPTに.hakoで単純置き換えマクロ実装中
    • 場所: apps/macros/selfhost_min/, apps/macros/examples/
    • 方式: JSON文字列操作のみMacroBoxSpec.expand(json) -> json
  • 🔜 本格対応: セルフホスティング後にフル機能を.hakoで再実装

Phase 16実装済み機能Rust版、バグあり

場所: src/macro/

  1. AST Pattern Matching (pattern.rs, 253行)

    • TemplatePattern$placeholder変数
    • OrPattern複数テンプレート選択
    • Variadic pattern$...args
  2. Quote/Unquote システム (pattern.rs:9-114)

    • AstBuilder::quote()文字列→AST
    • AstBuilder::unquote()(テンプレート展開)
    • Variadic splicing
  3. Match式構文 (src/parser/expr/match_expr.rs, 392行)

    • リテラルパターン + OR
    • 型パターン(TypeName(bind) => ...
    • ガード式(pattern if condition => ...
  4. @derive マクロ (engine.rs:68-96)

    • @derive(Equals)自動equals()生成)
    • @derive(ToString)自動toString()生成)
    • Public fieldsのみ使用
  5. @test ランナー (mod.rs:61-401)

    • test_* 関数自動検出
    • JSON引数注入
    • 自動ハーネス生成
  6. マクロエンジン (engine.rs, 195行)

    • 多段展開最大32パス
    • 循環検出
    • パフォーマンストレース

🚀 Phase 20 実装計画

優先度1: @derive マクロ(最も便利)

実装目標

// ユーザーコード
@derive(Equals, ToString)
box Person {
    name: StringBox
    age: IntegerBox
}

// 自動生成される:
// equals(other) { return me.name == other.name && me.age == other.age }
// toString() { return "Person(" + me.name + "," + me.age + ")" }

実装場所案

apps/macros/derive/
├── derive_equals.hako       # Equals実装
├── derive_tostring.hako     # ToString実装
├── derive_clone.hako        # Clone実装将来
├── derive_debug.hako        # Debug実装将来
└── README.md                # 使い方・設計書

実装契約

// apps/macros/derive/derive_equals.hako
static box DeriveEqualsMacro {
    expand(json, ctx) {
        // 1. JSON AST解析
        // 2. BoxDeclaration検出
        // 3. public_fieldsを取得
        // 4. equals()メソッドをJSON ASTで生成
        // 5. methodsに追加
        return modified_json
    }
}

優先度2: @test ランナー

セルフホスティングコードのテスト自動化。

実装場所案

apps/macros/test/
├── test_runner.hako         # テストランナー本体
├── test_collector.hako      # test_*関数収集
└── README.md

優先度3: AST Pattern Matching

複雑なマクロのための基盤機能。

実装場所案

apps/macros/pattern/
├── pattern_matcher.hako     # パターンマッチエンジン
├── ast_walker.hako          # AST走査ヘルパー
└── README.md

優先度4: Quote/Unquote

テンプレートベースのコード生成。

優先度5: Match式型パターン

型安全なパターンマッチング。

📊 実装戦略

Step 1: 最小限のderive実装Phase 20.1

期間: 1-2週間 成果物: @derive(Equals) のみ動作

  1. Rust版 src/macro/engine.rs:build_equals_method() を参考に.hako実装
  2. JSON AST操作のみで実装AstBuilderBox等を作成
  3. スモークテスト作成(tools/smokes/v2/profiles/quick/macro/derive_equals_vm.sh

Step 2: derive拡張Phase 20.2

期間: 1週間 成果物: @derive(ToString, Clone, Debug)

Step 3: @test ランナーPhase 20.3

期間: 2-3週間 成果物: セルフホスティングコード全体のテスト自動化

Step 4: Pattern/Quote基盤Phase 20.4-20.5

期間: 3-4週間 成果物: 複雑なマクロ実装が可能に

🎯 成功条件

Phase 20.1完了条件

  • @derive(Equals)が動作最低3つのBoxでテスト
  • 既存Rust版deriveと同じ出力
  • スモークテスト通過
  • パフォーマンス: 展開時間 < 200ms

Phase 20完了条件

  • @derive(Equals, ToString, Clone, Debug)すべて動作
  • @test ランナー動作セルフホスティングコード100%カバー)
  • Pattern Matching基盤動作
  • Quote/Unquote動作
  • Rust版マクロシステム削除可能移行完了

📝 設計メモ

JSON AST操作の課題

Phase 16のRust実装はnyash_rust::ASTNode構造体を直接操作したが、 Phase 20ではJSON文字列としてのASTを操作する必要がある。

解決策候補:

  1. JsonAstBox: JSON AST操作ヘルパーBox

    • parse(json) -> AstNode簡易AST表現
    • generate(ast) -> json
    • walk(ast, visitor)AST走査
  2. 文字列操作のみ: 現在の暫定実装を拡張

    • 利点: シンプル
    • 欠点: 複雑なマクロは困難

推奨: JsonAstBoxを先に実装Phase 20.0

Rust版との互換性

環境変数で切り替え可能にする:

# Rust版バグあり、非推奨
NYASH_MACRO_DERIVE_BACKEND=rust ./hako program.hako

# Hakorune版デフォルト、Phase 20実装
NYASH_MACRO_DERIVE_BACKEND=hako ./hako program.hako

🔗 関連リソース

Phase 16Rust実装版

現在の暫定実装

  • apps/macros/selfhost_min/README.md - 単純置き換えマクロ
  • apps/macros/examples/upper_string_macro.nyash - 実装例
  • src/macro/macro_box_ny.rs - ユーザーマクロローダー

環境変数ドキュメント

  • docs/guides/macro-system.md - マクロシステム全体ガイド
  • docs/reference/environment-variables.md - 環境変数リファレンス

📅 スケジュール(暫定)

  • Phase 20.0: JsonAstBox基盤実装1週間
  • Phase 20.1: @derive(Equals)実装2週間
  • Phase 20.2: @derive拡張1週間
  • Phase 20.3: @test ランナー3週間
  • Phase 20.4-20.5: Pattern/Quote4週間

合計: 約11週間2.5ヶ月)

開始条件: Phase 15.7完了(セルフホスティング実現)


Next Steps:

  1. Phase 15.7完了を待つ
  2. Phase 20.0開始: JsonAstBox設計・実装
  3. Phase 20.1開始: @derive(Equals)最小実装