#![feature(non_ascii_idents, box_syntax)]
#[macro_use]
extern crate lalrpop_lambda;
use lalrpop_lambda::Strategy;
fn main() {
println!("{} = {}", λ!{x.x}, abs!{x.x});
let ω = abs!{x.app!(x,x)};
println!("ω: {}", ω);
println!("app!(ω,x): {}", app!(ω,x));
println!("app!({{&ω}},x): {} -> {}",
app!({&ω},x),
app!({&ω},x).normalize(&Strategy::Applicative(false)));
let zero = λ!{f.λ!{x.x}};
println!("0: {}", &zero);
let one = λ!{f.λ!{x.γ!(f, x)}};
println!("1: {}", &one);
let id = λ!{x.x};
println!("(id one): {} -> {}",
app!({&id}, {&one}),
app!({&id}, {&one}).normalize(&Strategy::Applicative(false)));
let two = abs!{f.abs!{x.app!(var!(f),
app!(app!(abs!{f.abs!{x.app!(var!(f),
var!(x))}},
var!(f)),var!(x)))}};
println!("two: {} -> {}",
two,
two.normalize(&Strategy::Applicative(false)));
println!("{}", abs!{x y.app!(x,y)});
println!("{}", abs!{.abs!{.abs!{.var!("")}}});
println!("{}", abs!{x:t.x});
}