mathexpr 0.1.1

A fast, safe mathematical expression parser and evaluator with bytecode compilation
Documentation
//! Basic usage examples for mathexpr.
//!
//! Run with: cargo run --example basic

use mathexpr::{eval, Expression};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // ===========================================
    // Quick one-liner evaluation
    // ===========================================
    println!("=== One-liner Evaluation ===\n");

    let result = eval("2 + 3 * 4", &[], &[])?;
    println!("2 + 3 * 4 = {}", result);

    let result = eval("sqrt(x^2 + y^2)", &["x", "y"], &[3.0, 4.0])?;
    println!("sqrt(3^2 + 4^2) = {}", result);

    // ===========================================
    // Compile once, evaluate many times
    // ===========================================
    println!("\n=== Reusable Expressions ===\n");

    let distance =
        Expression::parse("sqrt((x1 - x2)^2 + (y1 - y2)^2)")?.compile(&["x1", "y1", "x2", "y2"])?;

    println!("Distance formula: sqrt((x1 - x2)^2 + (y1 - y2)^2)");
    println!(
        "  (0,0) to (3,4) = {}",
        distance.eval(&[0.0, 0.0, 3.0, 4.0])?
    );
    println!(
        "  (1,1) to (4,5) = {}",
        distance.eval(&[1.0, 1.0, 4.0, 5.0])?
    );
    println!(
        "  (-2,3) to (4,-1) = {}",
        distance.eval(&[-2.0, 3.0, 4.0, -1.0])?
    );

    // ===========================================
    // Using constants (pi, e)
    // ===========================================
    println!("\n=== Constants ===\n");

    let circumference = Expression::parse("2 * pi * r")?.compile(&["r"])?;
    println!("Circumference (r=5): {:.4}", circumference.eval(&[5.0])?);

    let area = Expression::parse("pi * r^2")?.compile(&["r"])?;
    println!("Area (r=5): {:.4}", area.eval(&[5.0])?);

    let growth = Expression::parse("e^x")?.compile(&["x"])?;
    println!("e^2 = {:.4}", growth.eval(&[2.0])?);

    // ===========================================
    // Using the current value (_)
    // ===========================================
    println!("\n=== Current Value (_) ===\n");

    let normalize = Expression::parse("(_ - min) / (max - min)")?.compile(&["min", "max"])?;
    println!("Normalizing to [0, 100]:");
    println!(
        "  25 -> {}",
        normalize.eval_with_current(25.0, &[0.0, 100.0])?
    );
    println!(
        "  50 -> {}",
        normalize.eval_with_current(50.0, &[0.0, 100.0])?
    );
    println!(
        "  75 -> {}",
        normalize.eval_with_current(75.0, &[0.0, 100.0])?
    );

    // ===========================================
    // Built-in functions
    // ===========================================
    println!("\n=== Built-in Functions ===\n");

    // Trigonometry
    println!("Trigonometry:");
    println!("  sin(pi/6) = {:.4}", eval("sin(pi/6)", &[], &[])?);
    println!("  cos(pi/3) = {:.4}", eval("cos(pi/3)", &[], &[])?);
    println!("  tan(pi/4) = {:.4}", eval("tan(pi/4)", &[], &[])?);

    // Logarithms
    println!("\nLogarithms:");
    println!("  log(e) = {:.4}", eval("log(e)", &[], &[])?);
    println!("  log10(100) = {:.4}", eval("log10(100)", &[], &[])?);
    println!("  log2(8) = {:.4}", eval("log2(8)", &[], &[])?);

    // Rounding
    println!("\nRounding:");
    println!("  floor(3.7) = {}", eval("floor(3.7)", &[], &[])?);
    println!("  ceil(3.2) = {}", eval("ceil(3.2)", &[], &[])?);
    println!("  round(3.5) = {}", eval("round(3.5)", &[], &[])?);

    // Min/Max/Clamp
    println!("\nBounds:");
    println!("  min(5, 3) = {}", eval("min(5, 3)", &[], &[])?);
    println!("  max(5, 3) = {}", eval("max(5, 3)", &[], &[])?);
    println!(
        "  clamp(15, 0, 10) = {}",
        eval("clamp(15, 0, 10)", &[], &[])?
    );

    println!("\nDone!");
    Ok(())
}