]> Repositorios git - scryer-prolog.git/commitdiff
throw type_error(number, E) in arith_eval_by_metacall (#392)
authorMark Thom <[email protected]>
Sat, 23 May 2020 18:39:29 +0000 (12:39 -0600)
committerMark Thom <[email protected]>
Sat, 23 May 2020 18:39:29 +0000 (12:39 -0600)
src/prolog/machine/arithmetic_ops.rs
src/prolog/machine/machine_errors.rs
src/prolog/macros.rs

index d5f1c6944891fe967b9991067744a290dd2501b6..4039bcf43ea4d48f45cedfe586106d56a00f3288 100644 (file)
@@ -143,12 +143,10 @@ impl MachineState {
 
     pub(crate)
     fn arith_eval_by_metacall(&self, r: RegType) -> Result<Number, MachineStub> {
-        let a = self[r].clone();
-
         let caller = MachineError::functor_stub(clause_name!("(is)"), 2);
         let mut interms: Vec<Number> = Vec::with_capacity(64);
 
-        for addr in self.post_order_iter(a) {
+        for addr in self.post_order_iter(self[r]) {
             match self.heap.index_addr(&addr).as_ref() {
                 &HeapCellValue::NamedStr(2, ref name, _) => {
                     let a2 = interms.pop().unwrap();
@@ -241,10 +239,12 @@ impl MachineState {
                 &HeapCellValue::Atom(ref name, _) if name.as_str() == "pi" => {
                     interms.push(Number::Float(OrderedFloat(f64::consts::PI)))
                 }
-                _ => {
-                    return Err(self.error_form(
-                        MachineError::instantiation_error(),
-                        caller,
+                val => {
+                    return Err(self.type_error(
+                        ValidType::Number,
+                        val.context_free_clone(),
+                        clause_name!("(is)"),
+                        2,
                     ));
                 }
             }
index 74374e33aab2829a4082294a1cd7500feba9c072..ec8bf80fda1aee3fb3c01c3c57263462491b4f19 100644 (file)
@@ -43,6 +43,21 @@ impl TypeError for Addr {
     }
 }
 
+impl TypeError for HeapCellValue {
+    fn type_error(self, _: usize, valid_type: ValidType) -> MachineError {
+        let stub = functor!(
+            "type_error",
+            [atom(valid_type.as_str()), value(self)]
+        );
+
+        MachineError {
+            stub,
+            location: None,
+            from: ErrorProvenance::Received
+        }
+    }
+}
+
 impl TypeError for MachineStub {
     fn type_error(self, h: usize, valid_type: ValidType) -> MachineError {
         let stub = functor!(
@@ -502,7 +517,7 @@ pub enum ValidType {
     InCharacter,
     Integer,
     List,
-    //    Number,
+    Number,
     Pair,
     //    PredicateIndicator,
     //    Variable
@@ -525,7 +540,7 @@ impl ValidType {
             ValidType::InCharacter => "in_character",
             ValidType::Integer => "integer",
             ValidType::List => "list",
-            //            ValidType::Number => "number",
+            ValidType::Number => "number",
             ValidType::Pair => "pair",
             //            ValidType::PredicateIndicator => "predicate_indicator",
             //            ValidType::Variable => "variable"
index 0398d4c857639a5b3c1e20266e70ad707fc0b58a..dabdb3ded7ee09c3b8a32591db3a09987d6f042c 100644 (file)
@@ -121,6 +121,9 @@ macro_rules! functor_term {
     (atom($e:expr), $arity:expr, $aux_lens:expr, $addendum: ident) => (
         HeapCellValue::Atom(clause_name!($e), None)
     );
+    (value($e:expr), $arity:expr, $aux_lens:expr, $addendum: ident) => (
+        $e
+    );
     (string($h:expr, $e:expr), $arity:expr, $aux_lens:expr, $addendum: ident) => ({
         let len: usize = $aux_lens.iter().sum();
         let h = len + $arity + 1 + $addendum.h() + $h;