ocaml: phase 6 Hashtbl.iter / Hashtbl.fold (+2 tests, 494 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 35s

New host primitive _hashtbl_to_list returns the entries as a list of
OCaml tuples — ('tuple' k v) form, matching the AST representation
that the pattern-match VM (:ptuple) expects. Without that exact
shape, '(k, v) :: rest' patterns fail to match.

Hashtbl.iter / Hashtbl.fold in runtime walk that list with the user
fn. This closes a long-standing gap: previously Hashtbl was opaque
once values were written (we could only find_opt one key at a time).

  let t = Hashtbl.create 4 in
  Hashtbl.add t "a" 1; Hashtbl.add t "b" 2; Hashtbl.add t "c" 3;
  Hashtbl.fold (fun _ v acc -> acc + v) t 0   = 6
This commit is contained in:
2026-05-09 00:53:32 +00:00
parent 1b38f89055
commit 207dfc60ad
4 changed files with 51 additions and 1 deletions

View File

@@ -1222,6 +1222,12 @@ cat > "$TMPFILE" << 'EPOCHS'
(epoch 4944)
(eval "(ocaml-run \"string_of_int 7 ^ \\\"-\\\" ^ string_of_bool true\")")
;; ── Hashtbl.iter / Hashtbl.fold ─────────────────────────────
(epoch 4950)
(eval "(ocaml-run \"let t = Hashtbl.create 4 in Hashtbl.add t \\\"a\\\" 1; Hashtbl.add t \\\"b\\\" 2; Hashtbl.add t \\\"c\\\" 3; Hashtbl.fold (fun _ v acc -> acc + v) t 0\")")
(epoch 4951)
(eval "(ocaml-run \"let t = Hashtbl.create 4 in Hashtbl.add t \\\"x\\\" 10; Hashtbl.add t \\\"y\\\" 20; let total = ref 0 in Hashtbl.iter (fun _ v -> total := !total + v) t; !total\")")
EPOCHS
OUTPUT=$(timeout 360 "$SX_SERVER" < "$TMPFILE" 2>/dev/null)
@@ -1938,6 +1944,10 @@ check 4942 "sprintf %s = %d" '"answer = 42"'
check 4943 "sprintf %d%% literal percent" '"50%"'
check 4944 "string_of_int + string_of_b" '"7-true"'
# ── Hashtbl.iter / Hashtbl.fold ─────────────────────────────────
check 4950 "Hashtbl.fold sum 1+2+3" '6'
check 4951 "Hashtbl.iter ref accum 10+20" '30'
TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
echo "ok $PASS/$TOTAL OCaml-on-SX tests passed"