Files
hakorune/apps/tests/phase200d_digits_accumulate.hako
nyash-codex 32a91e31ac feat(joinir): Phase 200-B/C/D capture analysis + Phase 201-A reserved_value_ids infra
Phase 200-B: FunctionScopeCaptureAnalyzer implementation
- analyze_captured_vars_v2() with structural loop matching
- CapturedEnv for immutable function-scope variables
- ParamRole::Condition for condition-only variables

Phase 200-C: ConditionEnvBuilder extension
- build_with_captures() integrates CapturedEnv into ConditionEnv
- fn_body propagation through LoopPatternContext to Pattern 2

Phase 200-D: E2E verification
- capture detection working for base, limit, n etc.
- Test files: phase200d_capture_minimal.hako, phase200d_capture_in_condition.hako

Phase 201-A: MirBuilder reserved_value_ids infrastructure
- reserved_value_ids: HashSet<ValueId> field in MirBuilder
- next_value_id() skips reserved IDs
- merge/mod.rs sets/clears reserved IDs around JoinIR merge

Phase 201: JoinValueSpace design document
- Param/Local/PHI disjoint regions design
- API: alloc_param(), alloc_local(), reserve_phi()
- Migration plan for Pattern 1-4 lowerers

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:32:03 +09:00

34 lines
1.0 KiB
Plaintext

// Phase 200-D: Digits accumulation test (no body-local in condition)
// This test verifies captured variable (digits) with string accumulation
// without requiring Pattern 5 body-local promotion.
//
// Key constraints:
// - Loop condition uses only LoopParam (p) and OuterLocal (n)
// - No body-local variables in break/if conditions
// - digits is captured and used in loop body
static box Main {
main() {
local digits = "0123456789" // Captured var
local s = "abc" // Input string
local p = 0
local result = ""
local n = s.length() // n = 3
// Simple loop: iterate exactly n times
loop(p < n) {
local ch = s.substring(p, p + 1)
// Use digits to check if char is a digit (result not used in condition)
local is_digit = digits.indexOf(ch) // digits: captured
// Always append the char (no conditional break)
result = result + ch
p = p + 1
}
print(result) // Expected: "abc"
}
}