Changelog
View SourceAll 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.3.0 - 2026-09-02
Added
- Opt-in unit catalogs via
Elex.Units.CatalogandElex.Context.put_units/2(put_units!/2). Elex does not ship units; callers register categories, conversions, aliases, and derived formulas - Quantity results:
%Elex.Quantity{value, unit: %Elex.Unit{}}. Validate returns%Elex.Dimension{}for unitful types - Literal suffixes on numeric literals: registered name or alias (
10mm), power (5m^2), unbraced pipe (3 m|s), braced formula (1 {kg * m | s}) - Scientific notation (
1e3,1.5E-2);eandEcannot be unit names - Conversion:
evaluate(..., unit: …),validate/evaluatecategory: …, and expressionconvert/2,add_unit/2,remove_unit/1 - Derived categories (
formula:, hubdefault:, optionalidentity:that names the base-hub formula; a matching identity unit is still required);aliases:onadd_unit;Catalog.add_unit/3omits conversion ("value");Catalog.kind/2 - Non-additive categories (
additive: false) for temperature-style points Function
units:policies (:point | :additive | :none | :convert | :wrap | :unwrap); optionalcall/2andevaluate_call/2onElex.Function- Bang helpers:
add_variable!/3,add_variables!/2,put_units!/2,Unit.new!/1,Evaluator.evaluate!/2 - Ash
:expected_typemay be a catalog category when a catalog is attached - Helpers:
Validator.same_numeric_type/2,Unit.convertible?/3,Unit.compatible?/3,Unit.from_monomial/1
Changed
Elex.extract_variables/2requires a context so unit suffixes parse when a catalog is attached (wasextract_variables/1)Elex.add_variable/3andElex.add_variables/2always return{:ok, context} | {:error, reason}(use the bang variants to pipe)Elex.Evaluator.evaluate/2returns{:ok, result} | {:error, reason}(useevaluate!/2to raise; previously raisedRuntimeError)Elex.evaluate/2no longer prefixes evaluation failures withEvaluation error:; callers receive the same reason strings as parse/validate (division by zero)- Function evaluation errors with a string reason are no longer wrapped in
Error calling function name/arity: … - Without a units catalog, glued suffixes are unexpected tokens
(
width + 2mm→unexpected 'mm'), not a missing operand
0.2.3 - 2026-08-15
Changed
concatis 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/1to list registered functions with metadata (:module,:name,:arity,:signature,:description, and optional:category)Elex.list_standard_function_modules/0to distinguish built-in functions from custom ones- Optional
:categoryatom in thedocumentation/0callback onElex.Function(set on all built-in functions as:mathor: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
decimaldependency to~> 2.0 or ~> 3.0
0.2.0 - 2026-07-12
Added
- Unary minus operator (
-x,-(1 + 2)) - Modulo operator (
%) with*-level precedence nullliteral with equality comparisons tonulland nil variables- String ordering comparisons (
<,>,<=,>=) for string operands - Short-circuit evaluation for
and,or, andif(condition, a, b) - Math functions:
abs,pow,mod,clamp,between - Variadic
minandmax(two or more arguments) - String functions:
concat,length,contains,starts_with,ends_with,lower,upper,trim coalescefunction (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 fromrem(a, b)and%between(x, low, high)returns an error whenlow > high, matchingclamp/3
0.1.0 - 2025-07-12
Changed
Elex.evaluate/2returns{:error, reason}for all evaluation failures, including division by zeroElex.Inverter.invert/2returns{:ok, ast}or{:error, reason}instead of raising- Updated
decimaldependency to~> 3.1andashto~> 3.22
Added
- Expression parsing, type validation, and evaluation with
Decimalarithmetic - 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.Functionbehaviour for custom functions