haskell: Phase 7 string=[Char] — O(1) string-view head/tail + chr/ord/toUpper/toLower/++ (+35 tests, 810/810)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 49s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-06 19:44:19 +00:00
parent 859361d86a
commit 4a35998469
5 changed files with 315 additions and 69 deletions

View File

@@ -75,18 +75,18 @@ No OCaml changes are needed. The view type is fully representable as an SX dict.
### Phase 7 — String = [Char] (performant string views)
- [ ] Add `hk-str?` predicate to `runtime.sx` covering both native SX strings
- [x] Add `hk-str?` predicate to `runtime.sx` covering both native SX strings
and `{:hk-str buf :hk-off n}` view dicts.
- [ ] Implement `hk-str-head`, `hk-str-tail`, `hk-str-null?` helpers in
- [x] Implement `hk-str-head`, `hk-str-tail`, `hk-str-null?` helpers in
`runtime.sx`.
- [ ] In `match.sx`, intercept cons-pattern `":"` when scrutinee satisfies
- [x] In `match.sx`, intercept cons-pattern `":"` when scrutinee satisfies
`hk-str?`; decompose to (char-int, view) instead of the tagged-list path.
Nil-pattern `"[]"` matches `hk-str-null?`.
- [ ] Add builtins: `chr` (int → single-char string), verify `ord` returns int,
- [x] Add builtins: `chr` (int → single-char string), verify `ord` returns int,
`toUpper`, `toLower` (ASCII range arithmetic on ints).
- [ ] Ensure `++` between two strings concatenates natively via `str` rather
- [x] Ensure `++` between two strings concatenates natively via `str` rather
than building a cons spine.
- [ ] Tests in `lib/haskell/tests/string-char.sx` (≥ 15 tests: head/tail on
- [x] Tests in `lib/haskell/tests/string-char.sx` (≥ 15 tests: head/tail on
string literal, map over string, filter chars, chr/ord roundtrip, toUpper,
toLower, null/empty string view).
- [ ] Conformance programs (WebFetch + adapt):
@@ -283,3 +283,22 @@ No OCaml changes are needed. The view type is fully representable as an SX dict.
## Progress log
_Newest first._
**2026-05-06** — Phase 7 complete (string-view O(1) head/tail + `++` native concat):
- `runtime.sx`: added `hk-str?`, `hk-str-head`, `hk-str-tail`, `hk-str-null?`.
String views are `{:hk-str buf :hk-off n}` dicts; native SX strings satisfy the
predicate with implicit offset 0. All helpers are O(1) via `char-at` / `string-length`.
- `eval.sx`: added `chr` (int → single-char string via `char-from-code`), `toUpper`,
`toLower` (ASCII-range arithmetic). Fixed `ord` and all char predicates (`isAlpha`,
`isAlphaNum`, `isDigit`, `isSpace`, `isUpper`, `isLower`, `digitToInt`) to accept
integers from string-view decomposition (not only single-char strings).
- `match.sx`: cons-pattern `":"` now checks `hk-str?` before the tagged-list path,
decomposing to `(hk-str-head, hk-str-tail)`. Empty-list pattern (`p-list []`) also
accepts `hk-str-null?` values. `hk-match-list-pat` updated to traverse string views
element-by-element.
- `runtime.sx`: added `hk-str-to-native` (converts view dict to native string via reduce+char-at).
- `eval.sx`: `hk-list-append` now checks `hk-str?` first; converts both operands via
`hk-str-to-native` before native `str` concat. String `++` String no longer builds
a cons spine.
- 35 new tests in `lib/haskell/tests/string-char.sx` (35/35 passing).
- Full suite: 810/810 tests, 0 regressions (was 775).