#![recursion_limit = "18446744073709551615"]
#![feature(trace_macros)]
#[macro_export]
macro_rules! named {
( $any:tt ) => {
#[macro_use]
macro_rules! ans {
($var:ident)=>{
$var!($any);
};
($any1:tt ) => {
lambda!($any $any1);
}
}
}
}
#[macro_export]
macro_rules! if_same_else {
([$($a:tt)*] [$($b:tt)*] [$($any0:tt)*] [$($any1:tt)*]) => {
macro_rules! if_a_same_as_b_else {
($($b)* ) => {
lambda!($($any0)*);
};
( $($a)*) => {
lambda!($($any1)*);
};
}
if_a_same_as_b_else!($($a)*);
};
}
#[macro_export]
macro_rules! lambda {
($var:ident = $($any:tt)*)=>{
mod $var{
use crate::*;
#[macro_use]
macro_rules! named {
( $any1:tt ) => {
#[macro_export]
macro_rules! $var {
($var1:ident)=>{
$var1!($any1);
};
($any2:tt ) => {
lambda!($any1 $any2);
}
}
};
}
lambda!($($any)*);
}
};
({$($any0:tt)*})=>{
lambda!($($any0)*);
};
({$($any0:tt)*},$($any1:tt)*)=>{
lambda!($($any0)*, $($any1)* );
};
([$($any0:tt)*] [$($any1:tt)*] ) => {
lambda!($($any0)* $($any1)*);
};
(($($any1:tt)*) $($any2:tt)*)=>{
lambda!($($any1:tt)* $($any2:tt)*);
};
( $fun:tt $($var:ident)* , ( $($any1:tt)*) $($any2:tt)* )=> {
lambda!( $($any1)*; $fun $($var)*, () $($any2)*);
};
($var:ident $($any:tt)*)=>{
$var!( [$($any)*] );
};
($fun0:tt $($var0:ident)* , $var:ident $($any:tt)*)=> {
lambda!($fun0 $($var0)* , ($var) $($any)* );
};
({[,$($any0:tt)*]} $var00:ident $($var01:ident)*, $fun1:tt $($var1:ident)* $( , $fun2:tt $($var2:ident)* )* $(; $( $fun3:tt $($var3:ident)*),*)* )=>{
lambda!( {$($any0)*} $($var01)* $( , $fun2 $($var2)* )* $(; $( $fun3 $($var3)*),*)* );
};
({[$($any0:tt)*], ($($any1:tt)*) $($any2:tt)* } $var00:ident $($var01:ident)* , $fun1:tt $($var1:ident)* $( , $fun2:tt $($var2:ident)* )* $(; $( $fun3:tt $($var3:ident)*),*)* )=>{
lambda!({$($any1)*} $var00 , $fun1 $($var1)* ; {[$($any0)*] , () $($any2)* } $var00 $($var01)* , $fun1 $($var1)* $( , $fun2 $($var2)* )* $(; $( $fun3 $($var3)*),*)*);
};
({[$($any0:tt)*], $fun1:tt $($var1:ident)* $( , $fun11:tt $($var11:ident)* )* } $var00:ident $($var01:ident)* , $fun2:tt $($var2:ident)* $( , $fun3:tt $($var3:ident)* )* $(; $( $fun4:tt $($var4:ident)*),*)* )=>{
if_same_else!(
[$fun1 $($var1)*] [$var00][
{[$($any0)*, $fun2 $($var2)*] $( , $fun11 $($var11)* )* } $var00 $($var01)* , $fun2 $($var2)* $( , $fun3 $($var3)* )* $(; $( $fun4 $($var4)*),*)*
] [
{[$($any0)*, $fun1 $($var1)*] $( , $fun11 $($var11)* )* } $var00 $($var01)* , $fun2 $($var2)* $( , $fun3 $($var3)* )* $(; $( $fun4 $($var4)*),*)*
]
);
};
({$($any0:tt)*}$($var0:ident)* , $fun1:tt $($var1:ident)* $( , $fun2:tt $($var2:ident)* )* $(; $( $fun3:tt $($var3:ident)*),*)* )=> {
lambda!({[] , $($any0)*} $($var0)* , $fun1 $($var1)* $( , $fun2 $($var2)* )* $(; $( $fun3 $($var3)*),*)*);
};
( $fun1:tt $($var1:ident)* ; $fun2:tt $($var2:ident)* , () $($any:tt)* )=>{
lambda!( $fun2 $($var2)* , $fun1 $($var1)* $($any)*);
};
( { $($any0:tt)*} ; {[$($any1:tt)*], ( ) $($any2:tt)* } $($any3:tt)* )=>{
lambda!(
{[$($any1)* , ( $($any0)* )] $($any2)* } $($any3)*
);
};
($($any:tt)*)=>{
named!([$($any)*]);
};
}
#[macro_use]
mod into;
#[macro_use]
mod bool;
#[macro_use]
mod math;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
}
}