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();
&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,
));
}
}
}
}
+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!(
InCharacter,
Integer,
List,
- // Number,
+ Number,
Pair,
// PredicateIndicator,
// Variable
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"
(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;