Coder Social home page Coder Social logo

davassi / yarer Goto Github PK

View Code? Open in Web Editor NEW
18.0 1.0 1.0 1.17 MB

Yarer is a library and a cli app for resolving mathematical expressions. Internally it uses the shunting yard algorithm.

Home Page: https://github.com/davassi/Yarer

Rust 100.00%
rpn rpn-calculator rpn-expression rpn-resolver rust

yarer's Introduction

YARER - The math expression Evaluator

github build status crates.io docs.rs Downloads unsafe forbidden Project Status: Active โ€“ The project has reached a stable, usable state and is being actively developed.

Yarer (Yet Another Rust Expression Resolver) is a library for evaluating mathematical expressions. Internally it uses the shunting yard algorithm.

Usage

Example of usage of the library:

      let session = Session::init();
      let mut resolver = session.process("1+2"); // or even "(cos(10+e)+3*sin(9/pi))^2" 

      println!("The result is {}", resolver.resolve());

All that's needed is to get a new instance of the 'resolver' from a Session and hand over the expression to be analysed. The library just returns a variant natural number, or a decimal number if one exists in the expression (i.e '2.1+1') or is present a trigonometric function (i.e. 1/cos(x+1)).

Variables

Yarer handles variables and functions. Here an example:

      let session = Session::init();
      let mut resolver = session.process("1/cos(x^2)");

      session.set("x",1);
      println!("The result is {}", resolver.resolve());

and of course, the expression can be re-evaluated if the variable changes.

      //...
      session.set("x",-1);
      println!("The result is {}", resolver.resolve());

      session.set("x",0.001); 
      println!("The result is {}", resolver.resolve());
      //...

Casting

The result can be simply casted into a i32 or a f64 (if decimal) simply with

      let result: Number = resolver.resolve().unwrap();

      let int : i32 = result.into();
      // or
      let float : f64 = result.into();

CLI

Yarer can be used also from command line, and behaves in a very similar manner to GNU bc

      $ yarer
      Yarer v.0.1.7 - Yet Another Rust Expression Resolver.
      License MIT OR Apache-2.0
      > (1+9)*(8+2)+0!
      101
      > (1./2)+atan(10)
      1.1483608274590869
      > x=10
      > 3/sin(5*x^2)
      -6.41338354698791
      > ln(1)
      0
      > log(10)
      1
      > -2^-2
      0.25
      > 1/(log(10)+cos(0))^-2
      4
      > 4.5+7.9*2.2
      21.88
      > 9801/(2206*sqrt(2)) // approx of PI
      3.1415927300133055
      

News and Updates

Starting with Yarer version 0.1.7, natural numbers are implemented internally using BigInt from the num crate. Now it is possible to do calculations with arbitrarily large natural numbers.

    $ yarer
      Yarer v.0.1.7 - Yet Another Rust Expression Resolver.
      License MIT OR Apache-2.0
      > 78!
      1132428117820629783145752115873204622873174957948825.....
      > 2^78
      302231454903657293676544

From Yarer version 0.1.5 it's possible to share a single session, and therefore a single heap of variables, for multiple resolvers. The library is not intended to be thread-safe.

    let session = Session::init();
    
    let mut res = session.process("x ^ 2");
    let mut res2 = session.process("x! - (x-1)!");

    session.set("x", 10);
   
    if let (Ok(a), Ok(b)) = (res.resolve(),res2.resolve()) {
        println!("{} {}", a, b); // 100 3265920
    }

Built-in Defined Functions

There are several math functions defined that you can use in your expression. More to come! There are many examples of processed expressions in the integration test file.

    Sin
    Cos
    Tan
    ASin
    ACos
    ATan
    Ln
    Log
    Abs
    Sqrt

Built-in Defined Constants

There are 2 predefined math constants at the moment:

    PI -> 3.14159265...
    e -> 2.7182818...

Execute

To run it from cargo, just type:

cargo run -q -- 

For logging debug just run with:

env RUST_LOG=yarer=debug cargo run -q -- 

or to build and install a release from the code:

cargo build --release
cargo install --path .
./target/release/yarer

Internal Implementation

Each expression is the result of an evaluation by the following actors

Step1 - Parser: A string is "regexed" and converted into a token array.

Step 2 - RpnResolver: Using the Shunting Yard algorithm the token array is converted from infix to postfix notation.

Step 3 - RpnResolver: The resulting RPN (Reverse Polish Notation) expression is evaluated.

Worth to mention that the Session is responsible to store all variables (and constants) that are borrowed by all the RpnResolvers.

Contribution

Besides being stable, Yarer is a work in progress. If you have suggestions for features (i.e. more math functions to implement), or if you find any issues in the code, design, interface, etc, please feel free to share them on our GitHub.

I appreciate very much your feedback!

yarer's People

Contributors

davassi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

maccraft123

yarer's Issues

In what ways does yarer support RPN?

The README for this crate describes it as using RPN, yet the examples are all clearly using infix notation, and the README further states that the CLI tool works like GNU bc instead of GNU dc, which does use RPN. I am confused about what you mean by describing yarer as RPN.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.