Changelog: tramaj-purs
On Fri, 25 Sep 2026, by @lucasdicioccio, 672 words, 0 code snippets, 1 links, 0images.
Changelog: tramaj-purs
Release history of tramaj-purs, the reference PureScript implementation: parser, evaluator, Node codec and analyses. Releases happen when there are
major changes rather than on a schedule; each entry below is one version.
Every implementation has its own page like this one, and each page is
tagged so the site builds one Atom feed per implementation:
#changelog #purescript #tramaj-purs
The 0.4.1 entry has breaking changes to numbers: Migrating to integers and floats says what to do about each.
tramaj-purs 0.5.02026-10-24
The ?shape allocation form, NotConcrete keys, parse errors at the mistake and astral characters. Includes 0.4.2, which was never released. On the PureScript registry.
- changed Breaking, symbolic mode only: a symbol or a term given as the key of `has` or `lookup` is `NotConcrete` (v3-symbols section 1.5), where it answered `false` or the fallback, reading an unknown key as a missing one. A concrete key keeps the tolerant behaviour: a missing key, an out-of-range index or a wrong-shaped container still answers `false` or the fallback.
- added `?shape(key, shape)` allocates a structure of symbols with one key and one site (v3-symbols section 1.2, decisions section 19). Each `~name` or `~name(e)` marker in the shape is a symbol `[key, "name"]` or `[key, "name", e]` at the form's site, and `{~name}` is short for `{name: ~name}`. It lowers at parse time, so the AST and the envelope are unchanged. A marker outside a shape or in a key, a bare marker under a lambda in the shape, a marker name used twice, a shape with no marker and a wrong argument count are parse errors. The corpus runner provides the `shape` profile.
- fixed An unclosed `(`, `[`, `{`, string or interpolation is reported where the closer was looked for, naming its opener and where it is (`')' to close the '(' of .div at line 1, column 5`), not at line 1, column 1. Every program that parsed still parses to the same AST.
- fixed A character above U+FFFF (most emoji) in a string, a static string (an object key, an import name, an action key) or a comment is read as one code point, where it was a parse error. This fix was versioned 0.4.2, which was never tagged or published; 0.5.0 is its first release.
tramaj-purs 0.4.12026-10-09
Two number types and arithmetic. On the PureScript registry.
- added Reference implementation of the language: parser, evaluator (concrete and symbolic modes), normative Node JSON codec and static analyses.
- added Conformance corpus under `corpus/cases`, shared with every other implementation.
- added Object destructuring patterns in `@` bindings and lambda parameters (decisions section 17): a parser lowering to plain `Let`/`Lambda`, checked by shared corpus cases 100-118.
- changed Breaking: numbers are two types, an integer and a float (decisions section 18). A literal and a JSON number are typed by their text: `3` is an integer, `3.0` and `3e0` are floats. Integers cover -(2^53 - 1) to 2^53 - 1; an integer outside that range is a parse error as a literal and a `TypeMismatch` in the context.
- changed Breaking: a number keeps its type when written. `str(1.0)` is `1.0` where it was `1`, and every JSON boundary writes a float with a fraction or an exponent.
- changed Breaking: `eq` never equates an integer with a float, and `lt`/`lte`/`gt`/`gte` take two integers or two floats; a mixed pair is a `TypeMismatch`.
- changed Breaking: `Tramaj.Json` replaces `Data.Argonaut.Core.Json` in the public API, with a reader and a writer that keep the type of a number.
- changed Breaking: `"$term"` is a reserved object key, and `int` and `float` replace `number` as v4 type primitives.
- added The arithmetic profile: `sum`, `product`, `negate`, `quotient`, `inverse`, `floor-quotient`, `modulo`, `floor` and `real`, and the `NotRepresentable` error. It is off by default: `evalProgramWith` and `runProgramWith` take an `Options` record that turns it on.
- added Terms: over a symbol an arithmetic builtin evaluates to `{"$term", "arguments"}`, with its operands as written.
- added `arithmeticOps` and `deepArithmeticOps`, the arithmetic names a program references.