# "Expression Language" _Path: en/lua/dynamic/expression_ > "Evaluate dynamic expressions using expr-lang syntax. Compile and execute safe expressions for filtering, validation, and rule evaluation without full…" ## Table of Contents - Expression Language ## Content # Expression Language The `expr` module compiles and evaluates [expr-lang](https://expr-lang.org/) expressions for filtering, validation, calculations, and rule evaluation without running Lua source code. This page is the canonical Lua API reference; its examples run inside an existing Wippy Lua process whose entry declares the `expr` module, but they are not standalone Wippy applications. See [Dynamic Evaluation](./eval.md) when choosing between expressions and capability-restricted Lua. ## Loading ```lua local expr = require("expr") ``` ## Caching `expr.eval` keeps an internal LRU cache of compiled expressions (default capacity 1000). The cache is built into the module and requires no configuration. ## Evaluating Expressions Evaluate an expression string and return its result. The function uses the internal cache of compiled expressions: ```lua -- Simple math local result, err = expr.eval("1 + 2 * 3") if err then return nil, err end -- result == 7 -- With variables local total, total_err = expr.eval("price * quantity", { price = 29.99, quantity = 3 }) if total_err then return nil, total_err end -- total == 89.97 -- Ternary operator local label, label_err = expr.eval('score > 90 ? "A" : score > 80 ? "B" : "C"', { score = 85 }) if label_err then return nil, label_err end -- label == "B" ``` | Parameter | Type | Description | |-----------|------|-------------| | `expression` | string | expr-lang syntax expression | | `env` | `any` | Variable environment for the expression (optional; normally a table) | **Returns:** `any, error` ## Compiling Expressions Compile an expression into a reusable `Program` for repeated evaluation: ```lua -- Compile once for repeated use local discount_calc, err = expr.compile("price * (1 - discount_rate)") if err then return nil, err end -- Reuse with different inputs local price1, run_err = discount_calc:run({price = 100, discount_rate = 0.1}) if run_err then return nil, run_err end local price2, second_run_err = discount_calc:run({price = 50, discount_rate = 0.2}) if second_run_err then return nil, second_run_err end -- price1 == 90 and price2 == 40 ``` | Parameter | Type | Description | |-----------|------|-------------| | `expression` | string | expr-lang syntax expression | | `env` | `any` | Type-hint environment for compilation (optional; normally a table) | **Returns:** `Program, error` ## Running Compiled Programs Run a compiled expression with the provided environment: ```lua -- Validation rule local validator, compile_err = expr.compile("len(password) >= 8 and len(password) <= 128") if compile_err then return nil, compile_err end local valid, run_err = validator:run({password = "securepass123"}) if run_err then return nil, run_err end -- valid == true -- Pricing rule local pricer, pricing_compile_err = expr.compile([[ base_price * quantity * (1 - bulk_discount) + shipping ]]) if pricing_compile_err then return nil, pricing_compile_err end local order_total, pricing_run_err = pricer:run({ base_price = 25.00, quantity = 10, bulk_discount = 0.15, shipping = 12.50 }) if pricing_run_err then return nil, pricing_run_err end -- order_total == 225.00 ``` | Parameter | Type | Description | |-----------|------|-------------| | `env` | `any` | Variable environment for the expression (optional; normally a table) | **Returns:** `any, error` ## Built-in Functions Expr-lang includes built-in functions for common operations: ```lua local maximum, max_err = expr.eval("max(1, 5, 3)") if max_err then return nil, max_err end local uppercase, upper_err = expr.eval('upper("hello")') if upper_err then return nil, upper_err end local total, sum_err = expr.eval("sum(values)", {values = {1, 2, 3, 4}}) if sum_err then return nil, sum_err end -- maximum == 5, uppercase == "HELLO", and total == 10 ``` Other built-ins include `min`, `abs`, `ceil`, `floor`, `len`, `lower`, and `trim`. Expr-lang also provides operators such as `contains` for strings and `in` for membership tests. ## Errors | Condition | Kind | Retryable | |-----------|------|-----------| | Expression is empty | `errors.INVALID` | no | | Expression syntax invalid | `errors.INTERNAL` | no | | Expression evaluation fails | `errors.INTERNAL` | no | | Result conversion fails | `errors.INTERNAL` | no | See [Error Handling](lua/core/errors.md) for working with errors. ## Navigation Previous: "Command Execution" (lua/dynamic/exec) Next: "WebAssembly Runtime" (wasm/overview)