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
use arret_syntax::datum::Datum;
use arret_runtime::boxed;
use arret_runtime::boxed::prelude::*;
use arret_runtime::boxed::refs::Gc;
pub fn box_syntax_datum(heap: &mut impl boxed::AsHeap, datum: &Datum) -> Gc<boxed::Any> {
match datum {
Datum::Bool(_, value) => boxed::Bool::singleton_ref(*value).as_any_ref(),
Datum::Int(_, val) => boxed::Int::new(heap, *val).as_any_ref(),
Datum::Float(_, val) => boxed::Float::new(heap, *val).as_any_ref(),
Datum::Char(_, val) => boxed::Char::new(heap, *val).as_any_ref(),
Datum::Str(_, val) => boxed::Str::new(heap, val.as_ref()).as_any_ref(),
Datum::Sym(_, val) => boxed::Sym::new(heap, val.as_ref()).as_any_ref(),
Datum::List(_, vs) => {
boxed::List::from_values(heap, vs.iter(), box_syntax_datum).as_any_ref()
}
Datum::Vector(_, vs) => {
boxed::Vector::from_values(heap, vs.iter(), box_syntax_datum).as_any_ref()
}
Datum::Set(_, vs) => {
boxed::Set::from_values(heap, vs.iter(), box_syntax_datum).as_any_ref()
}
Datum::Map(_, vs) => boxed::Map::from_values(heap, vs.iter(), |heap, (key, value)| {
(box_syntax_datum(heap, key), box_syntax_datum(heap, value))
})
.as_any_ref(),
}
}