refactor: unify string helpers and pattern2 derived slot
This commit is contained in:
@ -215,6 +215,39 @@ git revert 93022e7e1
|
||||
- **方針**: Pattern2 scope 内で完結、SSOT 維持、既定挙動不変
|
||||
- **Fail-Fast 原則**: 対象外は Ok(None) で後続経路へ、対象だが未対応は Err で即座に失敗(silent skip 禁止)
|
||||
|
||||
---
|
||||
|
||||
# Phase 29ab P4: Stage‑B 実ログ seg(Derived vs Promote 決定)
|
||||
|
||||
## Decision (SSOT)
|
||||
|
||||
**A: Derived slot** を採用する。
|
||||
|
||||
理由:
|
||||
- `seg` は loop body で再代入されるため、read-only promotion は原理的に不成立。
|
||||
- Stage‑B 実ログの形は「body 内で seg を再計算 → break で参照」であり、毎イテレーション再計算の Derived が素直。
|
||||
- 既存の Pattern2 の構造(BodyInit → Break)と `LoopBodyLocalEnv` に収まる。
|
||||
|
||||
## Derived slot contract (minimal)
|
||||
|
||||
- 対象は **Pattern2 break 条件で参照される LoopBodyLocal 1 変数**。
|
||||
- ループ body に以下の最小形があること:
|
||||
1. `local seg = <base>` が top-level に存在
|
||||
2. `if <cond> { seg = <then> } else { seg = <else> }` が top-level に存在
|
||||
3. break guard より前に 1) と 2) がある
|
||||
- `seg` への代入は上記 if/else のみ(他の代入がある場合は out-of-scope)
|
||||
- 代入式は **純粋**(MethodCall/Literal/Variable)のみ
|
||||
|
||||
## Fixtures / Smokes
|
||||
|
||||
- `apps/tests/phase263_pattern2_seg_realworld_min.hako` (Stage‑B 実ログ最小化)
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase263_pattern2_seg_realworld_min_vm.sh`
|
||||
|
||||
### Smoke switch rule
|
||||
|
||||
- **Before Derived slot**: freeze を PASS(`[joinir/freeze]` を期待)
|
||||
- **After Derived slot**: `print/return = 4` を PASS に切り替える
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **Plan file**: `/home/tomoaki/.claude/plans/eventual-mapping-lemon.md`
|
||||
|
||||
Reference in New Issue
Block a user