ocaml: phase 4 's.[i]' string indexing syntax (+3 tests, 484 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 44s

parse-atom-postfix now dispatches three cases after consuming '.':

  .field  -> existing field/module access
  .(EXPR) -> existing local-open
  .[EXPR] -> new string-get syntax  (this commit)

Eval reduces (:string-get S I) to host (nth S I), which already returns
a one-character string for OCaml's char model.

Lets us write idiomatic OCaml string traversal:

  let s = "hi" in
  let n = ref 0 in
  for i = 0 to String.length s - 1 do
    n := !n + Char.code s.[i]
  done;
  !n  (* = 209 *)
This commit is contained in:
2026-05-08 23:58:37 +00:00
parent bc4f4a5477
commit f895a118fb
4 changed files with 32 additions and 0 deletions

View File

@@ -1194,6 +1194,14 @@ cat > "$TMPFILE" << 'EPOCHS'
(epoch 4912)
(eval "(ocaml-run \"Option.(map (fun x -> x * 10) (Some 4))\")")
;; ── s.[i] string indexing ─────────────────────────────────────
(epoch 4920)
(eval "(ocaml-run \"let s = \\\"hello\\\" in s.[0]\")")
(epoch 4921)
(eval "(ocaml-run \"let s = \\\"abc\\\" in Char.code s.[2]\")")
(epoch 4922)
(eval "(ocaml-run \"let s = \\\"hi\\\" in let n = ref 0 in for i = 0 to String.length s - 1 do n := !n + Char.code s.[i] done; !n\")")
EPOCHS
OUTPUT=$(timeout 360 "$SX_SERVER" < "$TMPFILE" 2>/dev/null)
@@ -1893,6 +1901,11 @@ check 4910 "M.(expr) length" '3'
check 4911 "M.(expr) map" '(2 3 4)'
check 4912 "M.(expr) Option map" '("Some" 40)'
# ── s.[i] string indexing ────────────────────────────────────────
check 4920 "s.[0] hello" '"h"'
check 4921 "Char.code s.[2] abc" '99'
check 4922 "for i s.[i] sum hi" '209'
TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
echo "ok $PASS/$TOTAL OCaml-on-SX tests passed"