haskell: fix string ↔ [Char] equality — palindrome 12/12, conformance 34/34 (269/269)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 18s

Haskell strings are [Char]. Calling reverse / head / length on a SX raw
string transparently produces a cons-list of char codes (via hk-str-head /
hk-str-tail in runtime.sx), but (==) then compared the original raw string
against the char-code cons-list and always returned False — so
"racecar" == reverse "racecar" was False.

Added hk-try-charlist-to-string and hk-normalize-for-eq in eval.sx; routed
== and /= through hk-normalize-for-eq so a string compares equal to any
cons-list whose elements are valid Unicode code points spelling the same
characters, and "[]" ↔ "".

palindrome.hs lifts from 9/12 → 12/12; conformance 33/34 → 34/34 programs,
266/269 → 269/269 tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-07 20:35:28 +00:00
parent f1fea0f2f1
commit 544e79f533
4 changed files with 77 additions and 18 deletions

View File

@@ -315,6 +315,15 @@ No OCaml changes are needed. The view type is fully representable as an SX dict.
_Newest first._
**2026-05-07** — Fix string ↔ `[Char]` equality. `reverse`/`length`/`head`/etc.
on a string transparently coerce to a cons-list of char codes via `hk-str-head`
+ `hk-str-tail`, but `(==)` then compared the original raw string against the
char-code cons-list and always returned False. Added `hk-try-charlist-to-string`
+ `hk-normalize-for-eq` in `eval.sx` and routed `==` / `/=` through them, so a
string compares equal to any cons-list whose elements are valid Unicode code
points spelling the same characters (and `[]` ↔ `""`). palindrome.hs now 12/12;
conformance lifts to 34/34 programs, **269/269 tests** — full green.
**2026-05-07** — Phase 15 IORef complete (5 ops + module wiring + 13 unit
tests + 2 conformance programs). `hk-bind-data-ioref!` in `eval.sx` registers
`newIORef`, `readIORef`, `writeIORef`, `modifyIORef`, `modifyIORef'` under the