ocaml: phase 3 pattern matching + constructors (+18 tests, 183 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 56s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 56s
Constructor app: (:app (:con NAME) arg) -> (NAME …args). Tuple args
flatten so Pair(a,b) -> ("Pair" a b), matching the parser's pattern
flatten. Standalone (:con NAME) -> (NAME) nullary.
Pattern matcher: :pwild, :pvar, :plit, :pcon (head + arity), :pcons
(decompose), :plist (length match), :ptuple (after tuple tag). Match
walks clauses until first success; runtime error on exhaustion.
Recursive list functions (len, sum, fact) work end-to-end.
This commit is contained in:
@@ -162,10 +162,13 @@ SX CEK evaluator (both JS and OCaml hosts)
|
||||
### Phase 3 — ADTs + pattern matching
|
||||
|
||||
- [ ] `type` declarations: `type t = A | B of t1 * t2 | C of { x: int }`.
|
||||
- [ ] Constructors as tagged lists: `A` → `(:A)`, `B(1, "x")` → `(:B 1 "x")`.
|
||||
- [ ] `match`/`with`: constructor, literal, variable, wildcard, tuple, list cons/nil,
|
||||
`as` binding, or-patterns, nested patterns, `when` guard.
|
||||
- [ ] Exhaustiveness: runtime error on incomplete match (no compile-time check yet).
|
||||
_(Parser + evaluator currently inferred-arity at runtime; type decls
|
||||
pending.)_
|
||||
- [x] Constructors as tagged lists: `A` → `("A")`, `B(1, "x")` → `("B" 1 "x")`.
|
||||
- [~] `match`/`with`: constructor, literal, variable, wildcard, tuple, list
|
||||
cons/nil, nested patterns. _(Pending: `as` binding, or-patterns,
|
||||
`when` guard.)_
|
||||
- [x] Exhaustiveness: runtime error on incomplete match (no compile-time check yet).
|
||||
- [ ] Built-in types: `option` (`None`/`Some`), `result` (`Ok`/`Error`),
|
||||
`list` (nil/cons), `bool`, `unit`, `exn`.
|
||||
- [ ] `exception` declarations; built-in: `Not_found`, `Invalid_argument`,
|
||||
@@ -317,6 +320,20 @@ the "mother tongue" closure: OCaml → SX → OCaml. This means:
|
||||
|
||||
_Newest first._
|
||||
|
||||
- 2026-05-08 Phase 3 — pattern matching evaluator + constructors (+18
|
||||
tests, 183 total). Constructor application: `(:app (:con NAME) arg)`
|
||||
builds a tagged list `(NAME …args)` with tuple args flattened (so
|
||||
`Pair (a, b)` → `("Pair" a b)` matches the parser's pattern flatten).
|
||||
Standalone ctor `(:con NAME)` → `(NAME)` (nullary). Pattern matcher:
|
||||
:pwild / :pvar / :plit (unboxed compare) / :pcon (head + arity match) /
|
||||
:pcons (cons-decompose) / :plist (length+items) / :ptuple (after `tuple`
|
||||
tag). Match drives clauses until first success; runtime error on
|
||||
exhaustion. Tested with option match, literal match, tuple match,
|
||||
recursive list functions (`len`, `sum`), nested ctor (`Pair(a,b)`).
|
||||
Note: arity flattening happens for any tuple-arg ctor — without ADT
|
||||
declarations there's no way to distinguish `Some (1,2)` (single tuple
|
||||
payload) from `Pair (1,2)` (two-arg ctor). All-flatten convention is
|
||||
consistent across parser + evaluator.
|
||||
- 2026-05-08 Phase 2 — `lib/ocaml/eval.sx`: ocaml-eval + ocaml-run +
|
||||
ocaml-run-program. Coverage: atoms, var lookup, :app (curried),
|
||||
:op (arithmetic/comparison/boolean/^/mod/::/|>), :neg, :not, :if,
|
||||
|
||||
Reference in New Issue
Block a user