fix(joinir): Phase 241-EX - Remove hardcoded 'sum' check from Pattern3

Remove legacy hardcoded 'sum' carrier validation that was blocking
array_filter patterns with different accumulator names (e.g., 'out').

Before: Pattern3 required carrier named 'sum' to exist
After: Pattern3 uses carrier_info generically (any carrier name works)

Test results:
- phase49_joinir_array_filter_smoke: PASS 
- phase49_joinir_array_filter_fallback: PASS 
- phase49_joinir_array_filter_ab_comparison: PASS 
- Full suite: 909/909 PASS, 0 FAIL

Also: Archive old roadmap documentation (67k lines moved to docs/archive/)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-11 00:48:42 +09:00
parent a7dbc15878
commit 811dfebf98
387 changed files with 106 additions and 5551 deletions

View File

@ -0,0 +1,61 @@
# MiniVM 構築ロードマップSelfHosting 足場)
Status: active (Stage B → C 準備)
目的
- Nyashスクリプト製の極小VMMiniVMを段階的に整備し、PyVM依存を徐々に薄める。
- まずは「JSON v0 → 実行print/if/loopの最小」の芯を安定化し、自己ホストの足場にする。
原則
- 小さく進める段階ゲート、既定OFF
- 既存Runner/マクロ/CIへの影響を最小化導線はenvで明示
- まずは正しさ・可読性を優先。性能は後段で最適化。
Stages概要
- Stage A完了
- 文字列スキャンで整数抽出→print、ifリテラル条件の最小到達。
- サンプル: `apps/selfhost-vm/mini_vm*.hako`
- スモークv2: `tools/smokes/v2/run.sh --profile quick --filter "mini_vm|selfhost"`
- Stage B進行中
- stdinローダ`NYASH_MINIVM_READ_STDIN=1`[実装済]
- JSON v0 ローダの最小強化Print(Literal/FunctionCall)、BinaryOp("+")の最小)[実装中]
- Stage C
- 最小命令の芯const / compare / branch / retloopの芯に直結
- binop(int+int) を本加算に変更(現状は簡易出力)
- if/loop の代表ケースを MiniVM で実行PyVM と出力一致)
- Stage D整備
- 解析の健全化:最小トークナイザ/カーソル Box 抽出、JSON 走査の責務分離
- 観測/安全:`NYASH_MINIVM_DEBUG=1`、最大ステップ、入力検証
受け入れ基準
- A: print/ifサンプルのスモーク常時緑
- B: stdin/argv経由のJSON供給で Print(Literal/FunctionCall)、BinaryOp("+") が正しく動作
- C: if/loop の簡易ケースが MiniVM で実行可能PyVMと出力一致
- D: 代表スモークが既定で安定デバッグON時のみ追加出力
実行・導線
- PyVM経由既定: `NYASH_VM_USE_PY=1` で Runner が MIR(JSON)→PyVM へ委譲
- MiniVM入力: `NYASH_MINIVM_READ_STDIN=1` で標準入力を `NYASH_SCRIPT_ARGS_JSON` に注入
- サンプル実行(例):
- `NYASH_MINIVM_READ_STDIN=1 echo '{"kind":"Program","body":[]}' | ./target/release/nyash --backend vm`
- もしくは v2 ランナーで関連スモークをフィルタ実行
関連
- 現在の短期タスクと進捗: `CURRENT_TASK.md` の「MiniVM 構築ロードマップ(整理)」
---
開発順序(迷わないための具体ステップ)
Now今すぐ
- compare の厳密化(<, == を先に完成 → その後 <=, >, >=, != を追加)
- binop(int+int) を本加算に修正(文字列→整数化→加算→文字列化)
- スモーク追加各1本ずつbinop / compare / ifMiniVM 版)
Next次の小粒
- 最小トークナイザ/カーソル Box 抽出index/substring を段階置換)
- FunctionCall の引数2個の最小対応echo(a,b)→連結)とスモーク
Later後で一気に
- loop の芯branch/jump/ret を活用)と代表スモーク
- ランナーの薄いFacadePyVM/Interpreter 切替を関数で吸収。巨大Trait導入は後回し

View File

@ -0,0 +1,27 @@
# Phase 17 — LoopForm SelfHosting & Polish
Status: planning
Purpose
- 固定済みのコア仕様を維持しつつ、Nyash側ユーザーマクロ標準ライブラリで LoopForm を先に実装し、ループの正規化を言語レベルで確立する。
- Rust側は既存MIR/LLVMの整流を活用PHI先頭グループ化の不変条件を活かす
- 実アプリ/自己ホストで磨き込みを進め、言語としての使い心地を上げる。
Scope
- LoopFormwhile→キャリア正規化のユーザーマクロ実装とガイド。
- 代表スモーク/ゴールデンの追加PyVM/LLVMの一致とPHI健全性チェックの拡充。
- Docsの整備設計・ガイド・運用ポリシー
Out of Scope機能追加ポーズ遵守
- Rust側の大規模なIR変更やバックエンド機能追加はしない必要最小限のバグ修正のみ
- 仕様変更は重大不具合を除き行わない。
Guardrailsシンプルさ維持
- Smallbydefault: 既定は簡素、プロファイルで拡張。
- ヒューリスティック禁止: 明示登録とAST検出のみ。
- バグは点修正、Docs/テストは積極整備。
Docs
- guides/loopform.md利用者向け
- loopform-design.md設計詳細
- SCHEDULE.md開発予定表

View File

@ -0,0 +1,44 @@
# Phase 17 — 開発予定表LoopForm SelfHosting & Polish
期間目安: 4週間総量は実アプリ進行に合わせて調整
Week 1 — LoopForm MVPwhile, break/continue無し
- 目標: whileループを“キャリアタプル”へ正規化するユーザーマクロを実装Nyash/PyVM
- 成果物:
- apps/macros/examples/loop_normalize_macro.hakoMVP
- ゴールデン: while基本/2変数キャリア/更新式の正規化
- スモーク: selfhost-preexpand で自動適用→PyVM/LLVMの一致
- 受け入れ基準:
- ループヘッダのPHIが先頭グループ化され、空PHIが存在しない
- 代表ケースでPyVM/LLVMの出力一致
Week 2 — break/continue 対応+キャリア自動抽出
- 目標: ループ内のbreak/continueを LoopForm の構造に沿って安全に配置。更新対象変数の集合からキャリア自動推定。
- 成果物:
- マクロ拡張: break/continue/ネストの最小対応
- ゴールデン: break/continue混在、未更新変数保持
- 受け入れ基準:
- 分岐経路の合流でキャリアが常にwelltyped
- 変数の外側スコープ値が期待通り
Week 3 — for/foreach限定設計ドキュメント深掘り
- 目標: for/foreach を while へ前処理→LoopFormへ正規化。
- 成果物:
- 追加パターン: for (init; cond; step) / foreach (x in xs)
- ドキュメント: loopform-design.md制約/限界/今後のMIR 4命令案
- 受け入れ基準:
- for/foreachの代表ケースで一致
Week 4 — Polishing & 実アプリ適用
- 目標: 実アプリ/自己ホストにLoopFormを適用して安定運用。
- 成果物:
- スモーク/ゴールデン拡充、CIゲート最小化fast/min
- ガイド更新guides/loopform.md
- 受け入れ基準:
- 実アプリの主要ユースケースが緑
リスク/対策
- 複雑なネスト/例外: MVPでは簡略try/finallyとの相互作用は先送り→ドキュメントに制約明記
- 性能: コンパイル時のみの変換負荷。実行性能はMIR/LLVMへ委譲→ベンチで観測
- 仕様逸脱: 凍結遵守。必要時は限定的なDocs変更で表現

View File

@ -0,0 +1,49 @@
# LoopForm Design — MacroDriven Loop Normalization
Goal
- ループで発生する「変数キャリアloopcarried values」を Nyash のユーザーマクロで前段正規化し、MIR/LLVM側は素直に最適化可能な形にする。
Key Idea
- ループ状態複数変数をタプルまたは専用Boxに束ねて“1個の搬送値carrier”として扱う。
- ループのヘッダで φ は常に“1つのタプル”にだけ付与される → PHIグルーピングの不変が自動で満たされる。
Normalization PatternwhileのMVP
```
// input
// i=0; sum=0; while (i<n) { sum = sum + a[i]; i = i + 1 }
// expanded
let __car0 = (i, sum);
head:
let (i, sum) = __car_phi;
if !(i < n) goto exit;
let __car1 = (i + 1, sum + a[i]);
__car_phi = φ(__car0, __car1);
goto head;
exit:
let (i, sum) = __car_phi;
```
Break/ContinueWeek2
- continue: “次のキャリア”を構築して head へ遷移。
- break: 現キャリアで exit へ遷移。
- ネスト時: 内側ループのcarrierと外側スコープの分解を明示する名称はgensym
for/foreachWeek3
- for (init; cond; step) は init→while(cond){ body; step } へ前処理後、同様に正規化。
- foreach は IteratorBoxMVP経由の while 形式へ前処理。
Constraints / Notes
- try/finally/throw との相互作用はMVPでは未対応将来ガイドで制約を明記
- キャリア自動抽出: 本体で再代入される変数集合を候補とし、ループ外で参照されるものを優先収集。
- 衛生: MacroCtx.gensym で __car_phi/__carK などの一意名を生成。
Integration
- ユーザーマクロ: `apps/macros/examples/loop_normalize_macro.hako`
- 事前展開: selfhostpreexpand autoPyVM限定で適用
- 検証: macrogolden + LLVM PHI健全性スモーク空PHIなし/先頭グループ化)
Future Work先の先
- MIRに LoopHeader/LoopLatch/LoopContinue/LoopExit の4命令を導入した正規形を検討最適化/解析の高速化)。
- Boxベースの LoopState/Carrier の型体系を整理(型推論との接続)。