From 59ab4cd67cf77d704b74aee361bbd717c68eca14 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 12 May 2019 22:21:29 -0400 Subject: [PATCH] process float/1 and pi/0 --- README.md | 2 +- src/prolog/arithmetic.rs | 6 ++++++ src/prolog/machine/machine_state_impl.rs | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e0a009ee..721d2f34 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ The following predicates are built-in to Scryer. `(rem)/2`, `(mod)/2`, `(/\)/2`, `(\/)/2`, `(>>)/2`,`(<<)/2`, `(\)/1`, `abs/1`, `sin/1`, `cos/1`, `tan/1`, `asin/1`, `acos/1`, `atan/1`, `atan2/2`, `log/1`, `exp/1`, `sqrt/1`, `float/1`, - `truncate/1`, `round/1`, `floor/1`, `ceiling/1` + `truncate/1`, `round/1`, `floor/1`, `ceiling/1`, `pi/0` * Comparison operators: `>`, `<`, `=<`, `>=`, `=:=`, `=\=`. * `(:)/2` * `(@>)/2` diff --git a/src/prolog/arithmetic.rs b/src/prolog/arithmetic.rs index f3b67778..cad6f04c 100644 --- a/src/prolog/arithmetic.rs +++ b/src/prolog/arithmetic.rs @@ -40,6 +40,10 @@ impl<'a> ArithInstructionIterator<'a> { match ClauseType::from(name.clone(), terms.len(), fixity.clone()) { ct @ ClauseType::Named(..) | ct @ ClauseType::Op(..) => Ok(TermIterState::Clause(Level::Shallow, 0, cell, ct, terms)), + ClauseType::Inlined(InlinedClauseType::IsFloat(_)) => { + let ct = ClauseType::Named(clause_name!("float"), 1, CodeIndex::default()); + Ok(TermIterState::Clause(Level::Shallow, 0, cell, ct, terms)) + }, _ => Err(ArithmeticError::NonEvaluableFunctor(Constant::Atom(name.clone(), fixity.clone()), terms.len())) @@ -233,6 +237,8 @@ impl<'a> ArithmeticEvaluator<'a> self.interm.push(ArithmeticTerm::Number(Number::Float(n.clone()))), &Constant::Rational(ref n) => self.interm.push(ArithmeticTerm::Number(Number::Rational(n.clone()))), + &Constant::Atom(ref name, _) if name.as_str() == "pi" => + self.interm.push(ArithmeticTerm::Number(Number::Float(OrderedFloat(f64::consts::PI)))), _ => return Err(ArithmeticError::NonEvaluableFunctor(c.clone(), 0)) } diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index cd2c9214..c378a54f 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -930,6 +930,9 @@ impl MachineState { interms.push(Number::Float(n)), HeapCellValue::Addr(Addr::Con(Constant::Rational(n))) => interms.push(Number::Rational(n)), + HeapCellValue::Addr(Addr::Con(Constant::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)) } -- 2.54.0