Merge pull request #2017 from cmpute/master
Upgrade dashu and make the related code more idomatic.
This commit is contained in:
30
Cargo.lock
generated
30
Cargo.lock
generated
@@ -388,8 +388,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu"
|
name = "dashu"
|
||||||
version = "0.3.1"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0b669b1473cc6b33aba72ab3ddfe1055ff8fc28accd85130c412c2cd922a7c4e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
@@ -400,13 +401,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-base"
|
name = "dashu-base"
|
||||||
version = "0.3.1"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e183fc153511989674ede304b5592c74683393ca09cf20391898c28d6ba04264"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-float"
|
name = "dashu-float"
|
||||||
version = "0.3.2"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a7696675af30ae057b1629d27b153bbafb06461826b7d0ef1858d06b801f355f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-int",
|
"dashu-int",
|
||||||
@@ -417,8 +420,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-int"
|
name = "dashu-int"
|
||||||
version = "0.3.1"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc257a884b3e8c9a1a577ff7226dcb4d6bda0ff96dfa76975e2c9d7205e3b8ea"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
@@ -429,8 +433,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-macros"
|
name = "dashu-macros"
|
||||||
version = "0.3.1"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e496c319e615b86b21d6b0ea9e2f96a4f5fb2eb4178293b04a51ffc30a6c3f54"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
@@ -442,8 +447,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-ratio"
|
name = "dashu-ratio"
|
||||||
version = "0.3.2"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/cmpute/dashu.git#9d1ba4ac98a4675f294e2f2c072bf47f96d33e9b"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0f0f73f0ad6cbc94f52306455603e307b065af83bc61101968d53b6870127a05"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ libloading = "0.7"
|
|||||||
derive_deref = "1.1.1"
|
derive_deref = "1.1.1"
|
||||||
http-body-util = "0.1.0-rc.2"
|
http-body-util = "0.1.0-rc.2"
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
dashu = { version = "0.3.1", git = "https://github.com/cmpute/dashu.git" }
|
dashu = "0.4.0"
|
||||||
num-order = { version = "1.2.0" }
|
num-order = { version = "1.2.0" }
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
|
||||||
|
|||||||
@@ -386,8 +386,7 @@ pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
|
|||||||
&Number::Rational(ref r) => {
|
&Number::Rational(ref r) => {
|
||||||
let (_, floor) = (r.fract(), r.floor());
|
let (_, floor) = (r.fract(), r.floor());
|
||||||
|
|
||||||
let result = floor.clone().try_into();
|
if let Ok(value) = (&floor).try_into() {
|
||||||
if let Ok(value) = result{
|
|
||||||
fixnum!(Number, value, arena)
|
fixnum!(Number, value, arena)
|
||||||
} else {
|
} else {
|
||||||
Number::Integer(arena_alloc!(floor, arena))
|
Number::Integer(arena_alloc!(floor, arena))
|
||||||
@@ -713,13 +712,13 @@ impl TryFrom<HeapCellValue> for Number {
|
|||||||
|
|
||||||
// Computes n ^ power. Ignores the sign of power.
|
// Computes n ^ power. Ignores the sign of power.
|
||||||
pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
|
pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
|
||||||
let mut power = Integer::from(power.abs());
|
let mut power = power.abs();
|
||||||
|
|
||||||
if power.num_eq(&0) {
|
if power.is_zero() {
|
||||||
return Integer::from(1);
|
return Integer::ONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut oddand = Integer::from(1);
|
let mut oddand = Integer::ONE;
|
||||||
|
|
||||||
while power.num_gt(&1) {
|
while power.num_gt(&1) {
|
||||||
if power.bit(0) {
|
if power.bit(0) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
use crate::arena::*;
|
use crate::arena::*;
|
||||||
use crate::atom_table::*;
|
use crate::atom_table::*;
|
||||||
use crate::parser::ast::*;
|
use crate::parser::ast::*;
|
||||||
use crate::parser::dashu::{Integer, Rational};
|
use crate::parser::dashu::{ibig, Integer, Rational};
|
||||||
|
use crate::parser::dashu::base::RemEuclid;
|
||||||
|
use crate::parser::dashu::integer::Sign;
|
||||||
use crate::{
|
use crate::{
|
||||||
alpha_numeric_char, capital_letter_char, cut_char, decimal_digit_char, graphic_token_char,
|
alpha_numeric_char, capital_letter_char, cut_char, decimal_digit_char, graphic_token_char,
|
||||||
is_fx, is_infix, is_postfix, is_prefix, is_xf, is_xfx, is_xfy, is_yfx, semicolon_char,
|
is_fx, is_infix, is_postfix, is_prefix, is_xf, is_xfx, is_xfy, is_yfx, semicolon_char,
|
||||||
@@ -18,8 +20,6 @@ use crate::machine::stack::*;
|
|||||||
use crate::machine::streams::*;
|
use crate::machine::streams::*;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
use dashu::base::DivRem;
|
|
||||||
use dashu::base::DivRemEuclid;
|
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
|
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
@@ -515,13 +515,10 @@ pub(crate) fn numbervar(offset: &Integer, addr: HeapCellValue) -> Option<String>
|
|||||||
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
];
|
];
|
||||||
|
|
||||||
let n_clone: Integer = n.clone();
|
let i: usize = (&n).rem_euclid(ibig!(26)).try_into().unwrap();
|
||||||
|
let j = n / ibig!(26);
|
||||||
|
|
||||||
let i = n.div_rem_euclid(Integer::from(26)).1.to_f32().value() as usize;
|
if j.is_zero() {
|
||||||
let j = n_clone.div_rem(Integer::from(26));
|
|
||||||
let j = <(Integer, Integer)>::from(j).0;
|
|
||||||
|
|
||||||
if j == Integer::from(0) {
|
|
||||||
CHAR_CODES[i].to_string()
|
CHAR_CODES[i].to_string()
|
||||||
} else {
|
} else {
|
||||||
format!("{}{}", CHAR_CODES[i], j)
|
format!("{}{}", CHAR_CODES[i], j)
|
||||||
@@ -1024,7 +1021,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
|
|
||||||
match self.op_dir.get(&(atom!("rdiv"), Fixity::In)) {
|
match self.op_dir.get(&(atom!("rdiv"), Fixity::In)) {
|
||||||
Some(op_desc) => {
|
Some(op_desc) => {
|
||||||
if r.denominator().is_one() {
|
if r.is_int() {
|
||||||
let output_str = format!("{}", r);
|
let output_str = format!("{}", r);
|
||||||
|
|
||||||
push_space_if_amb!(self, &output_str, {
|
push_space_if_amb!(self, &output_str, {
|
||||||
@@ -1367,10 +1364,10 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
if self.numbervars && arity == 1 && name == atom!("$VAR") {
|
if self.numbervars && arity == 1 && name == atom!("$VAR") {
|
||||||
!self.iter.immediate_leaf_has_property(|addr| {
|
!self.iter.immediate_leaf_has_property(|addr| {
|
||||||
match Number::try_from(addr) {
|
match Number::try_from(addr) {
|
||||||
Ok(Number::Integer(n)) => &*n >= &Integer::from(0),
|
Ok(Number::Integer(n)) => (*n).sign() == Sign::Positive,
|
||||||
Ok(Number::Fixnum(n)) => n.get_num() >= 0,
|
Ok(Number::Fixnum(n)) => n.get_num() >= 0,
|
||||||
Ok(Number::Float(f)) => f >= OrderedFloat(0f64),
|
Ok(Number::Float(f)) => f >= OrderedFloat(0f64),
|
||||||
Ok(Number::Rational(r)) => &*r >= &Rational::from(0),
|
Ok(Number::Rational(r)) => (*r).sign() == Sign::Positive,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}) && needs_bracketing(op_desc, op)
|
}) && needs_bracketing(op_desc, op)
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
use dashu::base::Abs;
|
use dashu::base::Abs;
|
||||||
use dashu::base::DivRem;
|
|
||||||
use dashu::base::Gcd;
|
use dashu::base::Gcd;
|
||||||
use dashu::integer::IBig;
|
|
||||||
use divrem::*;
|
use divrem::*;
|
||||||
use num_order::NumOrd;
|
use num_order::NumOrd;
|
||||||
|
|
||||||
@@ -562,7 +560,7 @@ pub(crate) fn rdiv(
|
|||||||
r1: TypedArenaPtr<Rational>,
|
r1: TypedArenaPtr<Rational>,
|
||||||
r2: TypedArenaPtr<Rational>,
|
r2: TypedArenaPtr<Rational>,
|
||||||
) -> Result<Rational, MachineStubGen> {
|
) -> Result<Rational, MachineStubGen> {
|
||||||
if &*r2 == &Rational::from(0) {
|
if r2.is_zero() {
|
||||||
let stub_gen = || {
|
let stub_gen = || {
|
||||||
let rdiv_atom = atom!("rdiv");
|
let rdiv_atom = atom!("rdiv");
|
||||||
functor_stub(rdiv_atom, 2)
|
functor_stub(rdiv_atom, 2)
|
||||||
@@ -596,7 +594,7 @@ pub(crate) fn idiv(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
||||||
if (&*n2).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
Ok(Number::arena_from(Integer::from(n1) / &*n2, arena))
|
Ok(Number::arena_from(Integer::from(n1) / &*n2, arena))
|
||||||
@@ -610,13 +608,10 @@ pub(crate) fn idiv(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
if (&*n2).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(&*n1 / &*n2, arena))
|
||||||
<(Integer, Integer)>::from((&*n1).div_rem(&*n2)).0,
|
|
||||||
arena,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Fixnum(_), n2) | (Number::Integer(_), n2) => {
|
(Number::Fixnum(_), n2) | (Number::Integer(_), n2) => {
|
||||||
@@ -853,6 +848,16 @@ pub(crate) fn modulus(x: Number, y: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
functor_stub(mod_atom, 2)
|
functor_stub(mod_atom, 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn ibig_rem_floor(n1: &Integer, n2: &Integer) -> Integer {
|
||||||
|
if n1 > &Integer::ZERO && n2 < &Integer::ZERO {
|
||||||
|
((n1 - Integer::ONE) / n2) - Integer::ONE
|
||||||
|
} else if n1 < &Integer::ZERO && n2 > &Integer::ZERO {
|
||||||
|
((n1 + Integer::ONE) / n2) - Integer::ONE
|
||||||
|
} else {
|
||||||
|
n1 / n2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match (x, y) {
|
match (x, y) {
|
||||||
(Number::Fixnum(n1), Number::Fixnum(n2)) => {
|
(Number::Fixnum(n1), Number::Fixnum(n2)) => {
|
||||||
let n2_i = n2.get_num();
|
let n2_i = n2.get_num();
|
||||||
@@ -865,14 +870,11 @@ pub(crate) fn modulus(x: Number, y: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
||||||
if (&*n2).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
let n1 = Integer::from(n1.get_num());
|
let n1 = Integer::from(n1.get_num());
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(ibig_rem_floor(&n1, &*n2), arena))
|
||||||
<(Integer, Integer)>::from(n1.div_rem(&*n2)).1,
|
|
||||||
arena,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Fixnum(n2)) => {
|
(Number::Integer(n1), Number::Fixnum(n2)) => {
|
||||||
@@ -882,20 +884,14 @@ pub(crate) fn modulus(x: Number, y: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
let n2 = Integer::from(n2_i);
|
let n2 = Integer::from(n2_i);
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(ibig_rem_floor(&*n1, &n2), arena))
|
||||||
<(Integer, Integer)>::from((&*n1).div_rem(&n2)).1,
|
|
||||||
arena,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Integer(x), Number::Integer(y)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
if (&*y).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(ibig_rem_floor(&*n1, &*n2), arena))
|
||||||
<(Integer, Integer)>::from((&*x).div_rem(&*y)).1,
|
|
||||||
arena,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Integer(_), n2) | (Number::Fixnum(_), n2) => {
|
(Number::Integer(_), n2) | (Number::Fixnum(_), n2) => {
|
||||||
@@ -923,7 +919,7 @@ pub(crate) fn remainder(x: Number, y: Number, arena: &mut Arena) -> Result<Numbe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
(Number::Fixnum(n1), Number::Integer(n2)) => {
|
||||||
if (&*n2).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
let n1 = Integer::from(n1.get_num());
|
let n1 = Integer::from(n1.get_num());
|
||||||
@@ -941,7 +937,7 @@ pub(crate) fn remainder(x: Number, y: Number, arena: &mut Arena) -> Result<Numbe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
if (&*n2).num_eq(&0) {
|
if n2.is_zero() {
|
||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
Ok(Number::arena_from(Integer::from(&*n1 % &*n2), arena))
|
Ok(Number::arena_from(Integer::from(&*n1 % &*n2), arena))
|
||||||
@@ -968,7 +964,7 @@ pub(crate) fn gcd(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
|
|||||||
if let Some(result) = isize_gcd(n1_i, n2_i) {
|
if let Some(result) = isize_gcd(n1_i, n2_i) {
|
||||||
Ok(Number::arena_from(result, arena))
|
Ok(Number::arena_from(result, arena))
|
||||||
} else {
|
} else {
|
||||||
let value: IBig = Integer::from(n1_i).gcd(&Integer::from(n2_i)).into();
|
let value: Integer = Integer::from(n1_i).gcd(&Integer::from(n2_i)).into();
|
||||||
Ok(Number::arena_from(value, arena))
|
Ok(Number::arena_from(value, arena))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -978,9 +974,9 @@ pub(crate) fn gcd(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
|
|||||||
Ok(Number::arena_from(Integer::from(n2_clone.gcd(&n1)), arena))
|
Ok(Number::arena_from(Integer::from(n2_clone.gcd(&n1)), arena))
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
let n1_clone: Integer = (*n1).clone();
|
|
||||||
let n2: isize = (&*n2).try_into().unwrap();
|
let n2: isize = (&*n2).try_into().unwrap();
|
||||||
Ok(Number::arena_from(Integer::from(n1_clone.gcd(&Integer::from(n2))) as IBig, arena))
|
let value: Integer = (&*n1).gcd(&Integer::from(n2)).into();
|
||||||
|
Ok(Number::arena_from(value, arena))
|
||||||
}
|
}
|
||||||
(Number::Float(f), _) | (_, Number::Float(f)) => {
|
(Number::Float(f), _) | (_, Number::Float(f)) => {
|
||||||
let n = Number::Float(f);
|
let n = Number::Float(f);
|
||||||
|
|||||||
@@ -1636,7 +1636,7 @@ impl Machine {
|
|||||||
|
|
||||||
let arity = self.deref_register(3);
|
let arity = self.deref_register(3);
|
||||||
let arity = match Number::try_from(arity) {
|
let arity = match Number::try_from(arity) {
|
||||||
Ok(Number::Integer(n)) if &*n >= &Integer::from(0) && &*n <= &Integer::from(MAX_ARITY) => {
|
Ok(Number::Integer(n)) if &*n >= &Integer::ZERO && &*n <= &Integer::from(MAX_ARITY) => {
|
||||||
let value: usize = (&*n).try_into().unwrap();
|
let value: usize = (&*n).try_into().unwrap();
|
||||||
Ok(value)
|
Ok(value)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ use crate::parser::dashu::{Integer, Rational};
|
|||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
use indexmap::IndexSet;
|
use indexmap::IndexSet;
|
||||||
use num_order::NumOrd;
|
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
@@ -1183,10 +1182,7 @@ impl MachineState {
|
|||||||
|
|
||||||
let n = match n {
|
let n = match n {
|
||||||
Number::Fixnum(n) => n.get_num() as usize,
|
Number::Fixnum(n) => n.get_num() as usize,
|
||||||
Number::Integer(n) if (*n).num_ge(&0) && (*n).num_le(&std::usize::MAX) => {
|
Number::Integer(n) if usize::try_from(&*n).is_ok() => (&*n).try_into().unwrap(),
|
||||||
let value: usize = (&*n).try_into().unwrap();
|
|
||||||
value
|
|
||||||
},
|
|
||||||
_ => {
|
_ => {
|
||||||
self.fail = true;
|
self.fail = true;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|||||||
@@ -58,10 +58,7 @@ fn setup_predicate_indicator(term: &mut Term) -> Result<PredicateKey, Compilatio
|
|||||||
let name = terms.pop().unwrap();
|
let name = terms.pop().unwrap();
|
||||||
|
|
||||||
let arity = match arity {
|
let arity = match arity {
|
||||||
Term::Literal(_, Literal::Integer(n)) => {
|
Term::Literal(_, Literal::Integer(n)) => (&*n).try_into().ok(),
|
||||||
let value: usize = (&*n).try_into().unwrap();
|
|
||||||
Some(value)
|
|
||||||
},
|
|
||||||
Term::Literal(_, Literal::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
|
Term::Literal(_, Literal::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user