Real OCaml accepts `match e1, e2 with | p1, p2 -> …` without
surrounding parens. parse-pattern previously stopped at the cons
layer (`p :: rest`) and treated a trailing `,` as a separator
the outer caller couldn't handle, surfacing as
"expected op -> got op ,".
Fix: `parse-pattern` now collects comma-separated patterns into a
:ptuple after parse-pattern-cons, before the optional `as` alias.
The scrutinee side already built tuples via parse-tuple, so both
sides are now symmetric.
lru_cache.ml (iter 258) reverts its workaround back to the natural
form:
let rec take n lst = match n, lst with
| 0, _ -> []
| _, [] -> []
| _, h :: r -> h :: take (n - 1) r
607/607 regressions clean.
Functional LRU cache via association-list ordered most-recent-first.
Get / put both:
- find or remove the existing entry
- cons the fresh (k, v) to the front
- on put, trim the tail when over capacity
Sequence:
put 1 100; put 2 200; put 3 300
a = get 1 -> 100 (moves 1 to front)
put 4 400 (evicts 2)
b = get 2 -> -1 (no longer cached)
c = get 3 -> 300
d = get 1 -> 100
a + b + c + d = 499
Tests `match … with (k', v) :: rest when k' = k -> …` tuple-cons
patterns with `when` guards, `function` keyword for arg-less
match, recursive find/remove/take over the same list.
Parser limit found: `match n, lst with` ad-hoc tuple-scrutinee is
not yet supported (got "expected op -> got op ,"); workaround
uses outer `if` plus inner match.
171 baseline programs total.