meval 0.0.6

A simple math expression parser and evaluator.
Documentation
extern crate meval;
extern crate gnuplot;

use std::env::args;
use gnuplot::{Figure, Caption};
use meval::Expr;

const USAGE: &'static str = r"Plot functions of variable `x`.

Usage: plot EXPR1 EXPR2 ...

Example: plot 'sin(pi * x)'";

fn main() {
    let args = args().skip(1);
    if args.len() == 0 {
        println!("{}", USAGE);
    }

    let mut fg = Figure::new();
    fg.clear_axes();

    {
        let mut axes = fg.axes2d();

        let n = 100;
        let xi: Vec<_> = (0..n + 1).map(|i| i as f64 / n as f64).collect();

        for arg in args {
            // parse expression
            let expr = match Expr::from_str(&arg) {
                Ok(expr) => expr,
                Err(e) => return println!("Error when evaluating `{}`: {}", arg, e),
            };
            // create a function of one variable
            let func = match expr.bind("x") {
                Ok(func) => func,
                Err(e) =>
                    return println!("Error when trying to bind variable `x` in {}: {}", arg, e),
            };

            axes.lines(&xi, xi.iter().map(|&x| func(x)), &[Caption(&arg)]);
        }
    }
    fg.show();
}