Standard scalar function library for dew expressions.
This crate provides the foundation for numeric expressions: standard math functions
(sin, cos, sqrt, etc.), constants (pi, e, tau), and evaluation for scalar values.
All functions are generic over T: Float, supporting both f32 and f64.
Quick Start
use wick_core::Expr;
use wick_scalar::{eval, scalar_registry};
use std::collections::HashMap;
let expr = Expr::parse("sin(x * pi()) + 1").unwrap();
let vars: HashMap<String, f32> = [("x".into(), 0.5)].into();
let result = eval(expr.ast(), &vars, &scalar_registry()).unwrap();
assert!((result - 2.0).abs() < 0.001);
Features
| Feature |
Description |
wgsl |
WGSL shader code generation |
lua-codegen |
Lua code generation (pure Rust, WASM-safe) |
lua |
Lua codegen + mlua execution |
cranelift |
Cranelift JIT compilation |
Available Functions
Constants
| Function |
Description |
pi() |
π ≈ 3.14159 |
e() |
Euler's number ≈ 2.71828 |
tau() |
τ = 2π ≈ 6.28318 |
Trigonometric
| Function |
Description |
sin(x) |
Sine |
cos(x) |
Cosine |
tan(x) |
Tangent |
asin(x) |
Arcsine |
acos(x) |
Arccosine |
atan(x) |
Arctangent |
atan2(y, x) |
Two-argument arctangent |
sinh(x) |
Hyperbolic sine |
cosh(x) |
Hyperbolic cosine |
tanh(x) |
Hyperbolic tangent |
Exponential & Logarithmic
| Function |
Description |
exp(x) |
e^x |
exp2(x) |
2^x |
log(x) |
Natural logarithm (alias ln) |
ln(x) |
Natural logarithm |
log2(x) |
Base-2 logarithm |
log10(x) |
Base-10 logarithm |
pow(x, y) |
x^y |
sqrt(x) |
Square root |
inversesqrt(x) |
1 / sqrt(x) |
Common Math
| Function |
Description |
abs(x) |
Absolute value |
sign(x) |
Sign (-1, 0, or 1) |
floor(x) |
Round down |
ceil(x) |
Round up |
round(x) |
Round to nearest |
trunc(x) |
Truncate toward zero |
fract(x) |
Fractional part |
min(a, b) |
Minimum of two values |
max(a, b) |
Maximum of two values |
clamp(x, lo, hi) |
Clamp to range |
saturate(x) |
Clamp to [0, 1] |
Interpolation
| Function |
Description |
lerp(a, b, t) |
Linear interpolation: a + (b-a)*t |
mix(a, b, t) |
Alias for lerp (GLSL naming) |
step(edge, x) |
0 if x < edge, else 1 |
smoothstep(e0, e1, x) |
Smooth Hermite interpolation |
inverse_lerp(a, b, v) |
Inverse of lerp: (v-a) / (b-a) |
remap(x, i0, i1, o0, o1) |
Remap from [i0,i1] to [o0,o1] |
Custom Functions
You can register custom functions by implementing the [ScalarFn] trait:
use wick_scalar::{ScalarFn, FunctionRegistry, scalar_registry};
struct Double;
impl ScalarFn<f32> for Double {
fn name(&self) -> &str { "double" }
fn arg_count(&self) -> usize { 1 }
fn call(&self, args: &[f32]) -> f32 { args[0] * 2.0 }
}
let mut registry = scalar_registry();
registry.register(Double);
Using f64
All functions work with f64 by specifying the type parameter:
use wick_core::Expr;
use wick_scalar::{eval, scalar_registry, FunctionRegistry};
use std::collections::HashMap;
let registry: FunctionRegistry<f64> = scalar_registry();
let expr = Expr::parse("sqrt(2)").unwrap();
let result: f64 = eval(expr.ast(), &HashMap::new(), ®istry).unwrap();
assert!((result - std::f64::consts::SQRT_2).abs() < 1e-10);