1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#[doc(hidden)]
#[macro_export]
macro_rules! var {
($idx:expr) => {{
use $crate::{Client, RepeatedField, Term, Datum, TT, DT};
let mut id = Datum::new();
id.set_field_type(DT::R_NUM);
id.set_r_num($idx as f64);
let mut datum = Term::new();
datum.set_field_type(TT::DATUM);
datum.set_datum(id);
let mut var = Term::new();
var.set_field_type(TT::VAR);
let args = RepeatedField::from_vec(vec![datum]);
var.set_args(args);
let mut client = Client::new();
client.set_term(Ok(var));
client
}}
}
#[doc(hidden)]
#[macro_export]
macro_rules! func {
($f:tt, $( $v:expr ),* $(,)* ) => {{
use $crate::{Client, RepeatedField, Term, Datum, TT, DT};
#[allow(unused_mut)]
let mut ids = Vec::new();
let res: Client = $f(
$({
let id = $v;
for t in id.term().unwrap().get_args() {
ids.push(t.get_datum().clone());
}
id
},)*
);
let mut closure = Client::new();
match res.term() {
Ok(res) => {
let mut array = Datum::new();
array.set_field_type(DT::R_ARRAY);
let args = RepeatedField::from_vec(ids);
array.set_r_array(args);
let mut datum = Term::new();
datum.set_field_type(TT::DATUM);
datum.set_datum(array);
let mut func = Term::new();
func.set_field_type(TT::FUNC);
let args = RepeatedField::from_vec(vec![datum, res.clone()]);
func.set_args(args);
closure.set_term(Ok(func));
}
Err(error) => {
closure.set_term(Err(error));
}
}
closure
}}
}
macro_rules! with_args {
( $cmd:ident, $args:ident ) => {{
let mut tmp_args = $args;
if let Ok(ref mut term) = $cmd.term {
if tmp_args.has_field_type() {
term.mut_args().push(tmp_args);
} else {
for arg in tmp_args.take_args().into_vec() {
term.mut_args().push(arg);
}
for pair in tmp_args.take_optargs().into_vec() {
term.mut_optargs().push(pair);
}
}
}
}}
}
proc_macro_expr_decl!(
#[doc(hidden)]
__args! => args_impl
);
#[macro_export]
macro_rules! args {
( $($args:tt)* ) => {{
#[allow(unused_imports)]
use $crate::{Term, IntoArg, Arg};
__args!($($args)*)
}}
}