lmbd 0.1.4

A macro that computes everything at compile time.Based on lambda calculus.
Documentation
#![recursion_limit = "18446744073709551615"]
#![feature(trace_macros)]




// 每个mod都要有一个named宏,用于对结果命名,默认为ans

#[macro_export]
macro_rules! named {
    ( $any:tt ) => {
        #[macro_use]
        macro_rules! ans {
            ($var:ident)=>{
                $var!($any);
            };
            ($any1:tt ) => {
                lambda!($any $any1);
            }
        }
    }
}



// 假如ab相同则执行一段代码

#[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)*);
    };
}


/// 基础语法
/// f1, f2, f3 依次运算 将f2作为参数传给f1,将f3传给第一次运算的结果
/// f1,(f2, f3)先计算 将f3作为参数传给f2,将第一次运算的结果传给 f1
/// {...}x y z 以空格分隔的标识符是函数的变量
/// x = ... 将运算的最终结果赋值给x
/// { ... __  ...} __ x y z , f 
/// 使用已经定义的常量时,将它作为第一个变量传入
/// 其他的语法都是由lambda宏自己生成的,可以不使用


// 主宏
#[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)*);
    };

    // 处理可被化简的小括号
    //  1.小括号在开头
    (($($any1:tt)*) $($any2:tt)*)=>{
        lambda!($($any1:tt)* $($any2:tt)*);
    };

    //  2.小括号在第二位
    ( $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)*] $($any1:tt)* } $($var0:ident)* , {$($any2:tt)+} $( , $fun2:tt $($var2:ident)* )*  $(; $( $fun3:tt $($var3:ident)*),*)*  )=>{
    //     lambda!({[$($any0)* ,($($any2)+) ] $($any1)* } $($var0)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
    // };


    // 替换结束
    ({[,$($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!({[$($any0)*] $($any2)* }  $var00 $($var01)* , ({$($any1)*} $var00 ,  $fun1 $($var1)*) , $fun1 $($var1)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
        
        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)* 
        );
    };

    // // 化简结束
    // // 1. 最后剩余标识符
    // ( { [$($any0:tt)*] , $var0:ident } $($var1:ident)* )=> {

    // };

    // // 2. 
    // (  ) => {

    // };

    // // 假如已经得到了目标函数,开始化简
    // // 只进行常量化简,毕竟没有通用判断相等的方法
    // ( { $($any:tt)*  } $($var:ident)*)=>{
    //     lambda!( { [],  $($any)* }$($var)*);
    // };
    

    //处理不了的其他情况,用named宏对其命名
    ($($any:tt)*)=>{
        named!([$($any)*]);
    };

}


// macro_rules! mytest {
//     ({ $($any0:tt)*} ; {[$($any1:tt)*], ( ) $($any2:tt)* } $($any3:tt)* ) => {
//         println!("匹配成功");
//     };
//     ($($any:tt)*)=>{
//         println!("匹配不成功");
//     }
// }

#[macro_use]
mod into;

#[macro_use]
mod bool;

#[macro_use]
mod math;


#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn it_works() {

    }
}