c9355d7d58
The Term::Loop arm of write_term rendered binders as bare
`name = init;` statements inside the `loop { … }` body block, which
reads as C/Rust re-init-every-iteration semantics — a projection
lying about a body the prose surface exists to let the reader trust.
Rewrite to a parenthesised init-list on the keyword line,
`loop(acc = 0, i = 1) { … }`, positionally isomorphic to the
unchanged Term::Recur arm. Projection-only: loop/recur AST, Form-A,
JSON-AST, typecheck, codegen, and the Form-A↔JSON round-trip
invariant untouched. RED-first via two new committed
examples/*.prose.txt byte-equality snapshots + two snapshot_loop_*
tests; full ailang-prose suite 10/0; both ail-prose CLI byte-matches
green. Single-iteration milestone, brainstorm→plan→implement.
Spec: docs/specs/2026-05-18-prose-loop-binders.md
Plan: docs/plans/prose-loop-binders.1.md
17 lines
281 B
Plaintext
17 lines
281 B
Plaintext
// module loop_sum_to_run
|
|
|
|
/// loop-recur iter 3 — sum 1..10 via loop/recur. Expected stdout: 55.
|
|
fn main() -> Unit with IO {
|
|
print(sum_to(10))
|
|
}
|
|
|
|
fn sum_to(n: Int) -> Int {
|
|
loop(acc = 0, i = 1) {
|
|
if i > n {
|
|
acc
|
|
} else {
|
|
recur(acc + i, i + 1)
|
|
}
|
|
}
|
|
}
|