constants.push(Literal::Atom(atom));
}
/*
+ // constant_to_literal takes care of the downward conversion from Integer to Fixnum
+ // if possible.
Literal::Fixnum(ref n) => {
- constants.push(Literal::Integer(arena_alloc!(n, arena))); //Rc::new(Integer::from(*n))));
-
- /*
- if *n >= 0 {
- if let Ok(n) = usize::try_from(*n) {
- constants.push(Literal::Usize(n));
- }
- }
- */
+ constants.push(Literal::Integer(arena_alloc!(n, arena)));
}
*/
Literal::Integer(ref n) => {
let n1_i = n1.get_num();
let n2_i = n2.get_num();
- let n1 = Integer::from(n1_i);
-
if let Ok(n2) = usize::try_from(n2_i) {
- Ok(Number::arena_from(n1 >> n2, arena))
+ Ok(Number::arena_from(n1_i >> n2, arena))
} else {
- Ok(Number::arena_from(n1 >> usize::max_value(), arena))
+ Ok(Number::arena_from(n1_i >> usize::max_value(), arena))
}
}
(Number::Fixnum(n1), Number::Integer(n2)) => {
let n1_i = n1.get_num();
let n2_i = n2.get_num();
- let n1 = Integer::from(n1_i);
-
if let Ok(n2) = usize::try_from(n2_i) {
- Ok(Number::arena_from(n1 << n2, arena))
+ Ok(Number::arena_from(n1_i << n2, arena))
} else {
+ let n1 = Integer::from(n1_i);
Ok(Number::arena_from(n1 << usize::max_value(), arena))
}
}
Literal::Rational(r)
}
(ArenaHeaderTag::Integer, n) => {
- Literal::Integer(n)
+ let result = (&*n).try_into();
+
+ match result {
+ Ok(fixnum) => if let Ok(n) = Fixnum::build_with_checked(fixnum) {
+ Literal::Fixnum(n)
+ } else {
+ Literal::Integer(n)
+ },
+ Err(_) => Literal::Integer(n)
+ }
}
_ => {
unreachable!()