Changelog: tramaj-rs
On Fri, 25 Sep 2026, by @lucasdicioccio, 664 words, 0 code snippets, 1 links, 0images.
Changelog: tramaj-rs
Release history of tramaj-rs, the Rust implementation of the parser, evaluator 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 #rust #tramaj-rs
The 0.2.0 entry has breaking changes to numbers: Migrating to integers and floats says what to do about each.
tramaj-rs 0.2.02026-10-09
Language v5: two number types, arithmetic, sorting and number formatting. On crates.io.
- changed Breaking: numbers are two types, an integer and a float (decisions section 18): `Value::Int` and `Value::Float`, `Expr::IntLit` and `Expr::FloatLit`. A literal or a JSON number with neither a fraction nor an exponent is an integer. Nothing converts between the two: `eq(1, 1.0)` is false, `lt` and its siblings refuse a mixed pair, an index is an integer, and `str(1.0)` is `1.0`.
- changed Breaking: the integer range is the signed 64-bit one. A literal outside it is a parse error and a context number outside it a `TypeMismatch`; neither is rounded. A float too large for a double is refused the same way.
- changed Breaking: JSON goes in and out as `tramaj_rs::json::Json`, not `serde_json::Value`: `run_program`, `eval_program` and `Node` take and return it. `json::parse` types a number by its text and `json::stringify` writes an integer as digits and a float with a fraction or an exponent. `json::from_serde` and `json::to_serde` bridge to `serde_json`.
- changed Breaking: the type primitives `int` and `float` replace `number`, and `"$term"` is a reserved key: a parse error as an object key, a `TypeMismatch` in a context.
- added The arithmetic profile: `sum`, `product`, `negate`, `quotient`, `inverse`, `floor-quotient`, `modulo`, `floor` and `real`, and the `NotRepresentable` error. It is off by default: `Options`, `eval_program_with` and `run_program_with` turn it on.
- added Terms: over a symbol an arithmetic builtin evaluates to `{"$term": op, "arguments": [...]}`, with its operands as written.
- added `arithmetic_ops` and `deep_arithmetic_ops`, the arithmetic names a program references.
- added `round(x)`, the tenth name of the arithmetic profile (decisions section 20): the integer nearest to a float, a tie going away from zero, and a `NotRepresentable` outside the 64-bit range. Over a symbol it builds a term like the other nine, a seeded `round` term is accepted, and `arithmetic_ops` reports it. `ARITHMETIC_NAMES` has ten names.
- added `sort-by(list, fn)` and `sort-by-descending(list, fn)`: two special forms over one new constructor, `Expr::SortBy`. A stable sort by the key a function gives each element, applied once per element in index order. The keys of one call are all integers, all floats or all strings, compared by code point; anything else is a `TypeMismatch`, a symbol or a term a `NotConcrete`. Every analysis sees the collection and the key function. No profile is needed.
- added `format-number(x, decimals, group)`, an ordinary builtin of every profile: a number in positional decimal notation, with 0 to 20 decimals and a separator between groups of three digits. It rounds the exact value of the number, a tie going away from zero, and never writes an exponent or a negative zero.
- changed Breaking: `sort-by` and `sort-by-descending` are special-form names: a program can no longer bind one and call it, a wrong argument count is a parse error, and so is either name passed by reference. `Expr` has a new variant, and `format-number` is in `builtin_names`.
- added `eval::emitted_constraint_count`: how many constraints an evaluation emitted before equal ones are made one. It exists for the test that a sort applies its key function once per element, which no program can observe.
tramaj-rs 0.1.02026-10-01
Hand-written port kept in agreement with the other implementations through the shared conformance corpus.
- added Parser, AST, evaluator and static analyses, plus a program-card analysis.
- added Serde-based Node JSON codec.
- 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.