1#![recursion_limit = "18446744073709551615"]
2#![feature(trace_macros)]
3
4
5
6
7#[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#[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#[macro_export]
56macro_rules! lambda {
57
58 ($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 ({$($any0:tt)*})=>{
83 lambda!($($any0)*);
84 };
85
86 ({$($any0:tt)*},$($any1:tt)*)=>{
87 lambda!($($any0)*, $($any1)* );
88 };
89
90
91
92 ([$($any0:tt)*] [$($any1:tt)*] ) => {
94 lambda!($($any0)* $($any1)*);
95 };
96
97 (($($any1:tt)*) $($any2:tt)*)=>{
100 lambda!($($any1:tt)* $($any2:tt)*);
101 };
102
103 ( $fun:tt $($var:ident)* , ( $($any1:tt)*) $($any2:tt)* )=> {
105 lambda!( $($any1)*; $fun $($var)*, () $($any2)*);
106 };
107
108 ($var:ident $($any:tt)*)=>{
111 $var!( [$($any)*] );
112 };
113
114 ($fun0:tt $($var0:ident)* , $var:ident $($any:tt)*)=> {
116 lambda!($fun0 $($var0)* , ($var) $($any)* );
117 };
118
119 ({[,$($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 ({[$($any0:tt)*], ($($any1:tt)*) $($any2:tt)* } $var00:ident $($var01:ident)* , $fun1:tt $($var1:ident)* $( , $fun2:tt $($var2:ident)* )* $(; $( $fun3:tt $($var3:ident)*),*)* )=>{
132 lambda!({$($any1)*} $var00 , $fun1 $($var1)* ; {[$($any0)*] , () $($any2)* } $var00 $($var01)* , $fun1 $($var1)* $( , $fun2 $($var2)* )* $(; $( $fun3 $($var3)*),*)*);
135
136
137 };
138
139 ({[$($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 ({$($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 ( $fun1:tt $($var1:ident)* ; $fun2:tt $($var2:ident)* , () $($any:tt)* )=>{
158 lambda!( $fun2 $($var2)* , $fun1 $($var1)* $($any)*);
159 };
160
161 ( { $($any0:tt)*} ; {[$($any1:tt)*], ( ) $($any2:tt)* } $($any3:tt)* )=>{
163 lambda!(
164 {[$($any1)* , ( $($any0)* )] $($any2)* } $($any3)*
165 );
166 };
167
168 ($($any:tt)*)=>{
188 named!([$($any)*]);
189 };
190
191}
192
193
194#[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}