Crates.io | lamcalc |
lib.rs | lamcalc |
version | 1.2.0 |
source | src |
created_at | 2023-03-14 07:23:39.56025 |
updated_at | 2023-06-25 02:16:50.220023 |
description | A library for creating, parsing and evaluating lambda calculus |
homepage | https://sshwy.github.io/lamcalc/ |
repository | https://github.com/sshwy/lamcalc |
max_upload_size | |
id | 809593 |
size | 74,652 |
LamCalc implements untyped Lambda Calculus, Inspired by Lambda Calculus: Basic Interpreter in Rust (Part 2).
Current status: stabalized v1.
lambda!
macro for convenient definition.use lamcalc::{lambda, Error, parser::parse_exp};
fn main () -> Result<(), Error> {
// define using macro
let tt = lambda!(x. y. x); // use macro to define lambda
let ff = lambda!(x. (y. y)); // add parentheses for clarity
let and = lambda!(x.y.x y x); // space between dots are not necessary
// multiple printing format
println!("and = {}", and); // print lambda
println!("and = {:#}", and); // lambda with De Bruijn index
println!("and = {}", and.purify()); // De Bruijn encoding
// use braces to refer to previously defined lambda
let mut and_f_t = lambda!({and} {ff} {tt});
and_f_t.simplify()?; // get simplified result
assert_eq!(and_f_t, ff);
// parse lambda expression string
let y_combinator = lambda!(f.(x. f (x x)) (x. f (x x)));
let y_str = r#"\f.(\x. f (x x)) (\x. f (x x))"#;
let (y2, _) = parse_exp(y_str)?;
assert_eq!(y2, y_combinator);
Ok(())
}
See examples/
for more.