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 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}