Linguagem de Expressão
Avalie expressões dinâmicas usando a sintaxe expr-lang. Compile e execute expressões seguras para filtragem, validação e avaliação de regras sem execução Lua completa.
Cache
expr.eval mantém um cache LRU interno de expressões compiladas (capacidade padrão 1000). O cache é embutido no módulo e não requer configuração.
Carregamento
local expr = require("expr")
Avaliando Expressões
Avaliar uma string de expressão e retornar o resultado. Usa cache LRU interno para expressões compiladas:
-- Matemática simples
local result = expr.eval("1 + 2 * 3") -- 7
-- Com variáveis
local total = expr.eval("price * quantity", {
price = 29.99,
quantity = 3
})
if total_err then
return nil, total_err
end
-- total == 89.97
-- Expressões booleanas
local is_adult = expr.eval("age >= 18", {age = 21}) -- true
-- Operações com string
local greeting = expr.eval('name + " is " + status', {
name = "Alice",
status = "online"
}) -- "Alice is online"
-- Operador ternário
local label = expr.eval('score > 90 ? "A" : score > 80 ? "B" : "C"', {
score = 85
})
if label_err then
return nil, label_err
end
-- label == "B"
| Parâmetro | Tipo | Descrição |
|---|---|---|
expression |
string | Expressão em sintaxe expr-lang |
env |
table | Ambiente de variáveis para expressão (opcional) |
Retorna: any, error
Compilando Expressões
Compilar uma expressão em um objeto Program reutilizável para avaliação repetida:
-- 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
| Parâmetro | Tipo | Descrição |
|---|---|---|
expression |
string | Expressão em sintaxe expr-lang |
env |
table | Ambiente de tipos para compilação (opcional) |
Retorna: Program, error
Executando Programas Compilados
Executar uma expressão compilada com ambiente fornecido:
-- 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
| Parâmetro | Tipo | Descrição |
|---|---|---|
env |
table | Ambiente de variáveis para expressão (opcional) |
Retorna: any, error
Funções Built-in
Expr-lang fornece muitas funções built-in:
-- Funções matemáticas
expr.eval("max(1, 5, 3)") -- 5
expr.eval("min(10, 2, 8)") -- 2
expr.eval("abs(-42)") -- 42
expr.eval("ceil(3.2)") -- 4
expr.eval("floor(3.8)") -- 3
-- Funções de string
expr.eval('len("hello")') -- 5
expr.eval('upper("hello")') -- "HELLO"
expr.eval('lower("HELLO")') -- "hello"
expr.eval('trim(" hi ")') -- "hi"
expr.eval('"hello" contains "ell"') -- true
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
Outras funções integradas incluem min, abs, ceil, floor, len, lower e trim. Expr-lang também oferece operadores como contains para strings e in para testes de pertencimento.
Erros
| Condição | Tipo | Retentável |
|---|---|---|
| Expressão vazia | errors.INVALID |
não |
| Sintaxe de expressão inválida | errors.INTERNAL |
não |
| Avaliação de expressão falhou | errors.INTERNAL |
não |
| Conversão de resultado falhou | errors.INTERNAL |
não |
Veja Error Handling para trabalhar com erros.