lambda/
lib.rs

1#![recursion_limit = "18446744073709551615"]
2#![feature(trace_macros)]
3
4
5
6
7// 每个mod都要有一个named宏,用于对结果命名,默认为ans
8
9#[macro_export]
10macro_rules! named {
11    ( $any:tt ) => {
12        #[macro_use]
13        macro_rules! ans {
14            ($var:ident)=>{
15                $var!($any);
16            };
17            ($any1:tt ) => {
18                lambda!($any $any1);
19            }
20        }
21    }
22}
23
24
25
26// 假如ab相同则执行一段代码
27
28#[macro_export]
29macro_rules! if_same_else {
30    ([$($a:tt)*] [$($b:tt)*] [$($any0:tt)*] [$($any1:tt)*]) => {
31        macro_rules! if_a_same_as_b_else {
32            ($($b)* ) => {
33                lambda!($($any0)*);
34            };
35            ( $($a)*) => {
36                lambda!($($any1)*);
37            };
38        }
39        if_a_same_as_b_else!($($a)*);
40    };
41}
42
43
44/// 基础语法
45/// f1, f2, f3 依次运算 将f2作为参数传给f1,将f3传给第一次运算的结果
46/// f1,(f2, f3)先计算 将f3作为参数传给f2,将第一次运算的结果传给 f1
47/// {...}x y z 以空格分隔的标识符是函数的变量
48/// x = ... 将运算的最终结果赋值给x
49/// { ... __  ...} __ x y z , f 
50/// 使用已经定义的常量时,将它作为第一个变量传入
51/// 其他的语法都是由lambda宏自己生成的,可以不使用
52
53
54// 主宏
55#[macro_export]
56macro_rules! lambda {
57
58    // 假如开头有赋值语句,进行赋值操作
59    // 创建同名模块并创建导出同名宏
60    ($var:ident =  $($any:tt)*)=>{
61        mod $var{
62            use crate::*;
63            #[macro_use]
64            macro_rules! named {
65                ( $any1:tt ) => {
66                    #[macro_export]
67                    macro_rules! $var {
68                        ($var1:ident)=>{
69                            $var1!($any1);
70                        };
71                        ($any2:tt ) => {
72                            lambda!($any1 $any2);
73                        }
74                    }
75                };
76            }
77            lambda!($($any)*);
78        }
79    };
80
81    // 去除开头的无变量的大括号
82    ({$($any0:tt)*})=>{
83        lambda!($($any0)*);
84    };
85
86    ({$($any0:tt)*},$($any1:tt)*)=>{
87        lambda!($($any0)*, $($any1)* );
88    };
89
90
91
92    // 去除中括号
93    ([$($any0:tt)*] [$($any1:tt)*] ) => {
94        lambda!($($any0)* $($any1)*);
95    };
96
97    // 处理可被化简的小括号
98    //  1.小括号在开头
99    (($($any1:tt)*) $($any2:tt)*)=>{
100        lambda!($($any1:tt)* $($any2:tt)*);
101    };
102
103    //  2.小括号在第二位
104    ( $fun:tt $($var:ident)* , ( $($any1:tt)*) $($any2:tt)*  )=> {
105        lambda!( $($any1)*; $fun $($var)*, () $($any2)*);
106    };
107
108    // 假如变量是标识符,那么它一定是一个宏,中括号用于把所有的变为一个变量
109    //  标识符在第一位
110    ($var:ident $($any:tt)*)=>{
111        $var!( [$($any)*] );
112    };
113
114    //  标识符在第二位
115    ($fun0:tt $($var0:ident)* , $var:ident $($any:tt)*)=> {
116        lambda!($fun0 $($var0)* , ($var) $($any)* );
117    };
118
119    // 假如输入的变量为无参数的大括号
120    // ({[$($any0:tt)*] $($any1:tt)* } $($var0:ident)* , {$($any2:tt)+} $( , $fun2:tt $($var2:ident)* )*  $(; $( $fun3:tt $($var3:ident)*),*)*  )=>{
121    //     lambda!({[$($any0)* ,($($any2)+) ] $($any1)* } $($var0)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
122    // };
123
124
125    // 替换结束
126    ({[,$($any0:tt)*]} $var00:ident $($var01:ident)*, $fun1:tt $($var1:ident)* $( , $fun2:tt $($var2:ident)* )*  $(; $( $fun3:tt $($var3:ident)*),*)*  )=>{
127        lambda!( {$($any0)*} $($var01)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)* );
128    };
129
130    // 替换到小括号
131    ({[$($any0:tt)*], ($($any1:tt)*) $($any2:tt)* } $var00:ident $($var01:ident)* , $fun1:tt $($var1:ident)*  $( , $fun2:tt $($var2:ident)* )*  $(; $( $fun3:tt $($var3:ident)*),*)* )=>{
132        //lambda!({[$($any0)*] $($any2)* }  $var00 $($var01)* , ({$($any1)*} $var00 ,  $fun1 $($var1)*) , $fun1 $($var1)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
133        
134        lambda!({$($any1)*} $var00 , $fun1 $($var1)* ; {[$($any0)*] , () $($any2)* }  $var00 $($var01)* , $fun1 $($var1)* $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
135
136    
137    };
138
139    // 假如输入的变量为有参数的函数体
140    ({[$($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)*),*)*  )=>{
141        if_same_else!(
142            [$fun1 $($var1)*] [$var00][
143                {[$($any0)*, $fun2 $($var2)*] $( , $fun11 $($var11)* )* } $var00 $($var01)* , $fun2 $($var2)*  $( , $fun3 $($var3)* )*  $(; $( $fun4 $($var4)*),*)*
144            ] [
145                {[$($any0)*, $fun1 $($var1)*] $( , $fun11 $($var11)* )* } $var00 $($var01)* , $fun2 $($var2)*  $( , $fun3 $($var3)* )*  $(; $( $fun4 $($var4)*),*)*
146            ]
147        );
148    };
149
150    // 开始替换
151    ({$($any0:tt)*}$($var0:ident)* , $fun1:tt $($var1:ident)*  $( , $fun2:tt $($var2:ident)* )*  $(; $( $fun3:tt $($var3:ident)*),*)*  )=> {
152        lambda!({[] , $($any0)*} $($var0)* , $fun1 $($var1)*   $( , $fun2 $($var2)* )*  $(; $( $fun3 $($var3)*),*)*);
153    };
154
155
156    // 处理分号
157    ( $fun1:tt $($var1:ident)* ;  $fun2:tt $($var2:ident)* , () $($any:tt)*  )=>{
158        lambda!( $fun2 $($var2)* , $fun1 $($var1)* $($any)*);
159    };
160
161    // 处理分号
162    ( { $($any0:tt)*} ; {[$($any1:tt)*], ( ) $($any2:tt)* } $($any3:tt)*  )=>{
163        lambda!( 
164            {[$($any1)* , ( $($any0)* )] $($any2)* } $($any3)* 
165        );
166    };
167
168    // // 化简结束
169    // // 1. 最后剩余标识符
170    // ( { [$($any0:tt)*] , $var0:ident } $($var1:ident)* )=> {
171
172    // };
173
174    // // 2. 
175    // (  ) => {
176
177    // };
178
179    // // 假如已经得到了目标函数,开始化简
180    // // 只进行常量化简,毕竟没有通用判断相等的方法
181    // ( { $($any:tt)*  } $($var:ident)*)=>{
182    //     lambda!( { [],  $($any)* }$($var)*);
183    // };
184    
185
186    //处理不了的其他情况,用named宏对其命名
187    ($($any:tt)*)=>{
188        named!([$($any)*]);
189    };
190
191}
192
193
194// macro_rules! mytest {
195//     ({ $($any0:tt)*} ; {[$($any1:tt)*], ( ) $($any2:tt)* } $($any3:tt)* ) => {
196//         println!("匹配成功");
197//     };
198//     ($($any:tt)*)=>{
199//         println!("匹配不成功");
200//     }
201// }
202
203#[macro_use]
204mod into;
205
206#[macro_use]
207mod bool;
208
209#[macro_use]
210mod math;
211
212
213#[cfg(test)]
214mod tests {
215    use super::*;
216    #[test]
217    fn it_works() {
218
219    }
220}