Skip to main content

rex_ast/
macros.rs

1#[macro_export]
2macro_rules! assert_expr_eq {
3    ($lhs:expr, $rhs:expr) => {{
4        assert_eq!($lhs, $rhs);
5    }};
6
7    ($lhs:expr, $rhs:expr; ignore span) => {{
8        // override the id so we can assert equality without worrying about
9        // them, because they are usually randomly generated UUIDs
10        let lhs = ($lhs).reset_spans();
11        let rhs = ($rhs).reset_spans();
12
13        assert_eq!(lhs, rhs);
14    }};
15}
16
17#[macro_export]
18macro_rules! b {
19    ($x:expr) => {
20        ::std::sync::Arc::new($crate::Expr::Bool($crate::Span::default(), $x))
21    };
22
23    ($span:expr; $x:expr) => {
24        ::std::sync::Arc::new($crate::Expr::Bool(($span).into(), $x))
25    };
26
27    ($id:expr, $span:expr; $x:expr) => {
28        ::std::sync::Arc::new($crate::Expr::Bool(($id).into(), ($span).into(), $x))
29    };
30}
31
32#[macro_export]
33macro_rules! u {
34    ($x:expr) => {
35        ::std::sync::Arc::new($crate::Expr::Uint($crate::Span::default(), $x))
36    };
37
38    ($span:expr; $x:expr) => {
39        ::std::sync::Arc::new($crate::Expr::Uint(($span).into(), $x))
40    };
41
42    ($id:expr, $span:expr; $x:expr) => {
43        ::std::sync::Arc::new($crate::Expr::Uint(($id).into(), ($span).into(), $x))
44    };
45}
46
47#[macro_export]
48macro_rules! i {
49    ($x:expr) => {
50        ::std::sync::Arc::new($crate::Expr::Int($crate::Span::default(), $x))
51    };
52
53    ($span:expr; $x:expr) => {
54        ::std::sync::Arc::new($crate::Expr::Int(($span).into(), $x))
55    };
56
57    ($id:expr, $span:expr; $x:expr) => {
58        ::std::sync::Arc::new($crate::Expr::Int(($id).into(), ($span).into(), $x))
59    };
60}
61
62#[macro_export]
63macro_rules! f {
64    ($x:expr) => {
65        ::std::sync::Arc::new($crate::Expr::Float($crate::Span::default(), $x))
66    };
67
68    ($span:expr; $x:expr) => {
69        ::std::sync::Arc::new($crate::Expr::Float(($span).into(), $x))
70    };
71
72    ($id:expr, $span:expr; $x:expr) => {
73        ::std::sync::Arc::new($crate::Expr::Float(($id).into(), ($span).into(), $x))
74    };
75}
76
77#[macro_export]
78macro_rules! s {
79    ($x:expr) => {
80        ::std::sync::Arc::new($crate::Expr::String(
81            $crate::Span::default(),
82            $x.to_string(),
83        ))
84    };
85
86    ($span:expr; $x:expr) => {
87        ::std::sync::Arc::new($crate::Expr::String(($span).into(), ($x).to_string()))
88    };
89
90    ($id:expr, $span:expr; $x:expr) => {
91        ::std::sync::Arc::new($crate::Expr::String(
92            ($id).into(),
93            ($span).into(),
94            ($x).to_string(),
95        ))
96    };
97}
98
99#[macro_export]
100macro_rules! tup {
101    ($($xs:expr),* $(,)?) => {
102        ::std::sync::Arc::new($crate::Expr::Tuple($crate::Span::default(), vec![$($xs),*]))
103    };
104
105    ($span:expr; $($xs:expr),* $(,)?) => {
106        ::std::sync::Arc::new($crate::Expr::Tuple(($span).into(), vec![$($xs),*]))
107    };
108
109    ($id:expr, $span:expr; $($xs:expr),* $(,)?) => {
110        ::std::sync::Arc::new($crate::Expr::Tuple(($id).into(), ($span).into(), vec![$($xs),*]))
111    };
112}
113
114#[macro_export]
115macro_rules! l {
116    ($($xs:expr),* $(,)?) => {
117        ::std::sync::Arc::new($crate::Expr::List($crate::Span::default(), vec![$($xs),*]))
118    };
119
120    ($span:expr; $($xs:expr),* $(,)?) => {
121        ::std::sync::Arc::new($crate::Expr::List(($span).into(), vec![$($xs),*]))
122    };
123
124    ($id:expr, $span:expr; $($xs:expr),* $(,)?) => {
125        ::std::sync::Arc::new($crate::Expr::List(($id).into(), ($span).into(), vec![$($xs),*]))
126    };
127}
128
129#[macro_export]
130macro_rules! d {
131    ($($k:ident = $v:expr),* $(,)?) => {
132        ::std::sync::Arc::new($crate::Expr::Dict($crate::Span::default(), {
133            let mut map = ::std::collections::BTreeMap::new();
134            $(map.insert($crate::Symbol::intern(stringify!($k)), $v);)*
135            map
136        }))
137    };
138
139    ($span:expr; $($k:ident = $v:expr),* $(,)?) => {
140        ::std::sync::Arc::new($crate::Expr::Dict(($span).into(), {
141            let mut map = ::std::collections::BTreeMap::new();
142            $(map.insert($crate::Symbol::intern(stringify!($k)), $v);)*
143            map
144        }))
145    };
146
147    ($id:expr, $span:expr; $($k:ident = $v:expr),* $(,)?) => {
148        ::std::sync::Arc::new($crate::Expr::Dict(($id).into(), ($span).into(), {
149            let mut map = ::std::collections::BTreeMap::new();
150            $(map.insert($crate::Symbol::intern(stringify!($k)), $v);)*
151            map
152        }))
153    };
154}
155
156#[macro_export]
157macro_rules! v {
158    ($x:expr) => {
159        ::std::sync::Arc::new($crate::Expr::Var($crate::Var {
160            span: $crate::Span::default(),
161            name: $crate::Symbol::intern(&($x).to_string()),
162        }))
163    };
164
165    ($span:expr; $x:expr) => {
166        ::std::sync::Arc::new($crate::Expr::Var($crate::Var {
167            span: ($span).into(),
168            name: $crate::Symbol::intern(&($x).to_string()),
169        }))
170    };
171
172    ($id:expr, $span:expr; $x:expr) => {
173        ::std::sync::Arc::new($crate::Expr::Var($crate::Var {
174            id: ($id).into(),
175            span: ($span).into(),
176            name: $crate::Symbol::intern(&($x).to_string()),
177        }))
178    };
179}
180
181#[macro_export]
182macro_rules! app {
183    ($f:expr, $x:expr) => {
184        ::std::sync::Arc::new($crate::Expr::App(
185            $crate::Span::default(),
186            ($f).into(),
187            ($x).into(),
188        ))
189    };
190
191    ($span:expr; $f:expr, $x:expr) => {
192        ::std::sync::Arc::new($crate::Expr::App(($span).into(), ($f).into(), ($x).into()))
193    };
194
195    ($id:expr, $span:expr; $f:expr, $x:expr) => {
196        ::std::sync::Arc::new($crate::Expr::App(
197            ($id).into(),
198            ($span).into(),
199            ($f).into(),
200            ($x).into(),
201        ))
202    };
203}
204
205#[macro_export]
206macro_rules! lam {
207$x:ident -> $e:expr) => {
208        ::std::sync::Arc::new($crate::Expr::Lam(
209            $crate::Span::default(),
210            $crate::Scope::new_sync(),
211            $crate::Var::new(stringify!($x)),
212            None,
213            Vec::new(),
214            ($e).into(),
215        ))
216    };
217
218    ($span:expr; λ $x:ident -> $e:expr) => {
219        ::std::sync::Arc::new($crate::Expr::Lam(
220            ($span).into(),
221            $crate::Scope::new_sync(),
222            $crate::Var::new(stringify!($x)),
223            None,
224            Vec::new(),
225            ($e).into(),
226        ))
227    };
228
229    ($id:expr, $span:expr; λ $x:ident -> $e:expr) => {
230        ::std::sync::Arc::new($crate::Expr::Lam(
231            ($id).into(),
232            ($span).into(),
233            $crate::Scope::new_sync(),
234            $crate::Var::new(stringify!($x)),
235            None,
236            Vec::new(),
237            ($e).into(),
238        ))
239    };
240}
241
242#[macro_export]
243macro_rules! let_in {
244    (let $x:ident = ($e1:expr) in $e2:expr) => {
245        ::std::sync::Arc::new($crate::Expr::Let(
246            $crate::Span::default(),
247            $crate::Var::new(stringify!($x)),
248            None,
249            ($e1).into(),
250            ($e2).into(),
251        ))
252    };
253
254    ($span:expr; let $x:ident = ($e1:expr) in $e2:expr) => {
255        ::std::sync::Arc::new($crate::Expr::Let(
256            ($span).into(),
257            $crate::Var::new(stringify!($x)),
258            None,
259            ($e1).into(),
260            ($e2).into(),
261        ))
262    };
263
264    ($id:expr, $span:expr; let $x:ident = ($e1:expr) in $e2:expr) => {
265        ::std::sync::Arc::new($crate::Expr::Let(
266            ($id).into(),
267            ($span).into(),
268            $crate::Var::new(stringify!($x)),
269            None,
270            ($e1).into(),
271            ($e2).into(),
272        ))
273    };
274}
275
276#[macro_export]
277macro_rules! ite {
278    (if ($e1:expr) { $e2:expr } else { $e3:expr }) => {
279        ::std::sync::Arc::new($crate::Expr::Ite(
280            $crate::Span::default(),
281            ($e1).into(),
282            ($e2).into(),
283            ($e3).into(),
284        ))
285    };
286
287    ($span:expr; if ($e1:expr) { $e2:expr } else { $e3:expr }) => {
288        ::std::sync::Arc::new($crate::Expr::Ite(
289            ($span).into(),
290            ($e1).into(),
291            ($e2).into(),
292            ($e3).into(),
293        ))
294    };
295
296    ($id:expr, $span:expr; if ($e1:expr) { $e2:expr } else { $e3:expr }) => {
297        ::std::sync::Arc::new($crate::Expr::Ite(
298            ($span).into(),
299            ($e1).into(),
300            ($e2).into(),
301            ($e3).into(),
302        ))
303    };
304}