7个版本 (重大变更)
0.6.1 | 2019年6月23日 |
---|---|
0.5.0 | 2019年6月14日 |
0.4.1 | 2019年6月9日 |
0.3.0 | 2019年6月9日 |
0.1.0 | 2019年6月2日 |
在WebAssembly类别中排名921
360KB
888 代码行
λ演算解析器(使用LALRPOP)
轻松编写λ演算并对其进行评估。有多种方式使用此库(可以相互替换)
Expression
AST变体Abs
、App
和Var
- 宏
abs!
/λ!
、app!
/γ!
和var!
- 解析的λ演算字符串
λx.x (\a.\b.a)
- 本地类型:
u64
、bool
、fn
(进行中)
let id = λ!{x.x};
let one = λ!{f.λ!{x.γ!(f,x)}};
println!("{}", one.normalize(false));
assert_eq!(1u64, u64::from(app!({id},{one})));
使用(JS)
import("./node_modules/lalrpop-lambda/lalrpop_lambda.js").then(lambda => {
console.log([
new lambda.Exp("x"),
new lambda.Exp(5),
new lambda.Exp(false),
new lambda.Exp("(\\x.x) y").normalize(true)
])
});
使用(Rust)
use lalrpop_lambda::lambda::ExpressionParser;
let parser = ExpressionParser::new();
// Parse a single free variable.
let x = parser.parse("x");
// Parse the identity function.
let id = parser.parse(r"\x.x");
// f ∘ g
let compose = parser.parse(r"\f.\g.\x.(f (g x))"));
// Print the free variable in this expression.
let unbound_y = parser.parse(r"\x.x y");
println!("{}", unbound_y.free_variables());
// No need for parsing strings at all.
let id = λ!{x.x};
let one = λ!{f.λ!{x.γ!(f, x)}};
// Identity application.
let id = λ!{x.x};
println!("(id one): {} -> {}",
app!({&id}, {&one}),
app!({&id}, {&one}).normalize(false));
// Make the Y combinator.
let ω = parser.parse(r"λx.(x x)");
let Ω = parser.parse(r"(λx.(x x)) (λx.(x x))");
let W = parser.parse(r"λf.λx. f x x");
let Y = parser.parse(r"λf.(λx.f (x x)) (λx.f (x x))");
开发
这假设您已经有一个最新且可工作的rustup
副本。
cargo +nightly [build | test | bench | doc | run --example <>]
WASM
首先确保您已安装wasm-pack
。然后
wasm-pack build
依赖项
~3.5–5MB
~108K SLoC