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
每月下载量 54 次
60KB
1.5K SLoC
LamCalc: Lambda演算的实现
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