Changelog: tramaj-hs

On Fri, 25 Sep 2026, by @lucasdicioccio, 740 words, 0 code snippets, 1 links, 0images.

Changelog: tramaj-hs

Release history of tramaj-hs, the Haskell implementation, also the engine behind Kitchen-Sink’s templating sections. 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 #haskell #tramaj-hs

The 0.4.0.0 entry has breaking changes to numbers: Migrating to integers and floats says what to do about each.

tramaj-hs 0.5.0.02026-10-24

The ?shape allocation form, NotConcrete keys and parse errors at the mistake. On Hackage.

  • 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 (`expecting ')' 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.

tramaj-hs 0.4.0.02026-10-09

Two number types and arithmetic. On Hackage.

  • 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 the signed 64-bit range; one outside it 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.Aeson.Value` in the public API, with `JInt` and `JFloat`; `fromAeson` and `toAeson` bridge the two.
  • 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: `Options`, `defaultOptions`, `evalProgramWith` and `runProgramWith` turn it on.
  • added Terms: over a symbol an arithmetic builtin evaluates to `{"$term": op, "arguments": [...]}`, with its operands as written.
  • added `arithmeticOps` and `deepArithmeticOps`, the arithmetic names a program references.

tramaj-hs 0.3.0.0date not recorded

Implements v2 of the language: a rewrite of the semantic core, not an extension of it.

  • changed Documents are expressions: `Element` and `Fragment` are ordinary `Expr` constructors; the separate template-phase AST and `JsonProgram` are gone.
  • added `Tramaj.Node`, the normative interchange format, with an encoder and a strict decoder.
  • added `Tramaj.Analysis`: static import names, action keys, context holes, context reads and unsupplied params, with deep variants.
  • changed Imports take their parameters three ways (expression, `ctx(path)`, or later call); `partial-import` is gone.
  • changed `a <> b` concatenation, lazy `branch`, `adapt-actions`, `.(a, b)` fragments, string escapes, object shorthand, builtins as values.
  • fixed Malformed `action(...)`/`value(...)` in an element argument no longer backtracks into a meaningless `Call`; a backtick in a static string position is reported.

tramaj-hs 0.2.0.0date not recorded

Adds a JSON-producing mode for hosts that want the data half of the language on its own.

  • added `Tramaj.Ast.JsonProgram`, `Tramaj.Parser.parseJsonProgram` and `Tramaj.Eval.evalJsonProgram`.

tramaj-hs 0.1.0.0date not recorded

Initial release, extracted from the repository it was written in.

  • added Ports the PureScript package's `Tramaj.Ast` / `Tramaj.Parser` / `Tramaj.Eval` to megaparsec + aeson.