49 lines
3.9 KiB
Markdown
49 lines
3.9 KiB
Markdown
|
|
# Phase 25.1c — Env / Extern / BoxIntrospect Structural Cleanup
|
|||
|
|
|
|||
|
|
Status: planning(構造整理フェーズ・挙動は変えない)
|
|||
|
|
|
|||
|
|
## ゴール
|
|||
|
|
|
|||
|
|
- `env.*` / `hostbridge.*` / `env.box_introspect.*` の責務と経路を整理し、型システムまわりの「正しい入口」を 1 箇所に揃える。
|
|||
|
|
- Box 型情報 API(`env.box_introspect.kind` + `BoxTypeInspectorBox`)を **コア型システム**として扱えるようにする(plugins の有無に依存しない)。
|
|||
|
|
- i64 / MapBox / ArrayBox の unwrap ロジックを SSOT に寄せ、MirBuilder / JsonEmit / LoopOpts / BoxHelpers が同じ前提で動くようにする。
|
|||
|
|
|
|||
|
|
## スコープ(何をここで扱うか)
|
|||
|
|
|
|||
|
|
- 対象:
|
|||
|
|
- Rust 側: `extern_registry.rs` / `handlers/externals.rs` / `handlers/extern_provider.rs` / `runtime/plugin_loader_v2/*`
|
|||
|
|
- Hako 側: `BoxTypeInspectorBox` / `BoxHelpers` / `JsonEmitBox` / `MirSchemaBox` / `LoopOptsBox`
|
|||
|
|
- ドキュメント: `docs/specs`(env externs / box_introspect / numeric view の設計メモ)
|
|||
|
|
- 非対象:
|
|||
|
|
- 新しい言語機能や VM 命令の追加(Phase 25 ポリシーに従い、仕様拡張はしない)。
|
|||
|
|
- MirBuilder の意味論変更(multi‑carrier や LoopForm の設計は Phase 25.1b の範囲に留める)。
|
|||
|
|
|
|||
|
|
## やりたい整理(タスクリスト)
|
|||
|
|
|
|||
|
|
1. **env.* extern の SSOT を決める**
|
|||
|
|
- `env.get` / `env.mirbuilder.emit` / `env.codegen.emit_object` / `env.codegen.link_object` / `env.box_introspect.kind` を一覧化し、仕様(引数・戻り値・MIR 形)を `docs/specs/env_externs.md`(仮)に明文化する。
|
|||
|
|
- JSON v0 → MIR ブリッジ(`MapVars::resolve` / lowering)で、上記が必ず `ExternCall("env.*", ..)` に落ちることを確認・修正する。
|
|||
|
|
|
|||
|
|
2. **hostbridge.extern_invoke を「互換レイヤ」に押し込める**
|
|||
|
|
- 方針: 「`env.*` で表現できるものは ExternCall を正義とし、`hostbridge.extern_invoke` は互換用ラッパに限定する」。
|
|||
|
|
- Hako 側: `hostbridge.extern_invoke("env.*", ..)` は内部で `env.*` を呼ぶだけにする(新規コードは直接 `env.*` を使う)。
|
|||
|
|
- Rust 側: `"hostbridge.extern_invoke"` の実装は、`extern_provider_dispatch("env.*", ..)` に委譲する薄いブリッジに整理する。
|
|||
|
|
|
|||
|
|
3. **BoxIntrospect をコア型システムに昇格させる**
|
|||
|
|
- `env.box_introspect.kind` の実装を plugin loader v2 直下ではなく、コア runtime(例: `runtime/box_introspect.rs`)に寄せる。
|
|||
|
|
- コア型(MapBox / ArrayBox / StringBox / IntegerBox / BoolBox / NullBox)は runtime 側で `build_box_info` を定義し、plugin loader は「ユーザー Box の拡張」だけを担当する。
|
|||
|
|
- `BoxTypeInspectorBox` は `env.box_introspect.kind(value)` を唯一の情報源として扱い、repr ベースの fallback は「plugins も env.* も使えないデバッグ環境のみ」で使うことをコメントで明示する。
|
|||
|
|
|
|||
|
|
4. **Numeric view(i64 unwrap)の SSOT 化**
|
|||
|
|
- Hako 側: `string_helpers` / `BoxHelpers` / `MirSchemaBox` / `JsonEmitBox` / `LoopOptsBox` に散っている i64 unwrap ロジックを、小さなユーティリティ(仮: `box_numeric_view.hako`)に寄せる。
|
|||
|
|
- Rust 側: `NyashBox` から i64 を取り出す `as_i64` 的な関数を 1 箇所に置き、extern / BoxIntrospect 経路からはそれを使う。
|
|||
|
|
|
|||
|
|
## 進め方メモ
|
|||
|
|
|
|||
|
|
- 先にドキュメントを書く(env extern / BoxIntrospect / numeric view の仕様を `docs/specs` 配下に整理)→ そのあとで Bridge / VM / Hako を小さく揃える。
|
|||
|
|
- 既存フェーズとの関係:
|
|||
|
|
- Phase 25.1b: selfhost builder / multi‑carrier / BoxTypeInspector 実装フェーズ(機能側)。
|
|||
|
|
- Phase 25.1c: そのうち「env.* / hostbridge.* / BoxIntrospect の構造と責務」を整理するメタフェーズ(構造側)。
|
|||
|
|
- 挙動を変えないこと(Fail‑Fast / default path は現状維持)を前提に、小さな差分で進める。
|
|||
|
|
|