Changelog

View Source

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

0.2.3 - 2026-08-15

Changed

  • concat is now variadic and accepts zero or more string arguments (concat() returns ""; concat("a") returns "a")

0.2.2 - 2026-08-02

Added

  • match(text, pattern) string function for regex matching
  • String literal escapes: \", \\, \n, \t, \r, \f, \b
  • Elex.Context.list_functions/1 to list registered functions with metadata (:module, :name, :arity, :signature, :description, and optional :category)
  • Elex.list_standard_function_modules/0 to distinguish built-in functions from custom ones
  • Optional :category atom in the documentation/0 callback on Elex.Function (set on all built-in functions as :math or :string)

Changed

  • Unknown string escape sequences now report invalid escape sequence '\X' instead of a generic missing closing quote

0.2.1 - 2026-07-12

Changed

  • Relaxed decimal dependency to ~> 2.0 or ~> 3.0

0.2.0 - 2026-07-12

Added

  • Unary minus operator (-x, -(1 + 2))
  • Modulo operator (%) with *-level precedence
  • null literal with equality comparisons to null and nil variables
  • String ordering comparisons (<, >, <=, >=) for string operands
  • Short-circuit evaluation for and, or, and if(condition, a, b)
  • Math functions: abs, pow, mod, clamp, between
  • Variadic min and max (two or more arguments)
  • String functions: concat, length, contains, starts_with, ends_with, lower, upper, trim
  • coalesce function (variadic; returns the first non-null argument)
  • Hexdocs guides: Getting Started, Expression Language, Functions, Ash Integration, and Advanced Topics

Changed

  • mod(a, b) now uses floored modulo (sign follows the divisor), distinct from rem(a, b) and %
  • between(x, low, high) returns an error when low > high, matching clamp/3

0.1.0 - 2025-07-12

Changed

  • Elex.evaluate/2 returns {:error, reason} for all evaluation failures, including division by zero
  • Elex.Inverter.invert/2 returns {:ok, ast} or {:error, reason} instead of raising
  • Updated decimal dependency to ~> 3.1 and ash to ~> 3.22

Added

  • Expression parsing, type validation, and evaluation with Decimal arithmetic
  • Arithmetic, comparison, and logical operators
  • Built-in functions: ceil, floor, if, max, min, pi, rem, round, sqrt
  • Variable substitution and variable extraction from expressions
  • Expression inversion for simple single-variable arithmetic
  • Optional Ash resource validation via Elex.AshValidation
  • Elex.Function behaviour for custom functions