14个版本 (3个稳定版本)

1.2.0 2023年6月25日
1.1.0 2023年5月29日
1.0.0 2023年4月8日
0.4.5 2023年3月23日
0.1.0 2023年3月14日

WebAssembly 中排名 #462

Download history

每月下载量 54

MIT 许可协议

60KB
1.5K SLoC

LamCalc: Lambda演算的实现

docs.rs Crates.io tutorial

LamCalc实现了无类型的Lambda演算,灵感来源于Lambda Calculus: Basic Interpreter in Rust (Part 2)

当前状态:v1 稳定版。

特性

  • lambda! 宏方便定义。
  • 使用De Bruijn索引实现。
  • 表达式/定义/文件的解析器。
  • 用于Web应用的WASM包。

快速查看

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(())
}

更多信息请查看examples/

依赖

~2–5MB
~95K SLoC