*self.var_count.get(var).unwrap()
}
- fn mark_non_callable(
+ fn mark_var_in_non_callable(
&mut self,
name: Rc<Var>,
- arity: usize,
term_loc: GenContext,
vr: &'a Cell<VarReg>,
code: &mut Code,
) -> RegType {
- match self.marker.bindings().get(&name) {
- Some(&VarData::Temp(_, t, _)) if t != 0 => RegType::Temp(t),
- Some(&VarData::Perm(p)) if p != 0 => RegType::Perm(p),
- _ => {
- let mut target = Vec::new();
+ let mut target = Vec::new();
+ self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target);
- self.marker.reset_arg(arity);
- self.marker
- .mark_var(name, Level::Shallow, vr, term_loc, &mut target);
+ if !target.is_empty() {
+ code.extend(target.into_iter().map(Line::Query));
+ }
- if !target.is_empty() {
- for query_instr in target {
- code.push(Line::Query(query_instr));
- }
- }
+ vr.get().norm()
+ }
- vr.get().norm()
+ fn mark_non_callable(
+ &mut self,
+ name: Rc<Var>,
+ arg: usize,
+ term_loc: GenContext,
+ vr: &'a Cell<VarReg>,
+ code: &mut Code,
+ ) -> RegType {
+ match self.marker.bindings().get(&name) {
+ Some(&VarData::Temp(_, t, _)) if t != 0 => {
+ RegType::Temp(t)
+ }
+ Some(&VarData::Perm(p)) if p != 0 => {
+ if let GenContext::Last(_) = term_loc {
+ self.mark_var_in_non_callable(name.clone(), term_loc, vr, code);
+ temp_v!(arg)
+ } else {
+ RegType::Perm(p)
+ }
+ }
+ _ => {
+ self.mark_var_in_non_callable(name, term_loc, vr, code)
}
}
}
) -> Result<(), ParserError> {
match ct {
&InlinedClauseType::CompareNumber(cmp, ..) => {
- if let &Term::Var(ref vr, ref name) = terms[0].as_ref() {
- self.mark_non_callable(name.clone(), 2, term_loc, vr, code);
- }
-
- if let &Term::Var(ref vr, ref name) = terms[1].as_ref() {
- self.mark_non_callable(name.clone(), 2, term_loc, vr, code);
- }
+ self.marker.reset_arg(2);
let (mut lcode, at_1) = self.call_arith_eval(terms[0].as_ref(), 1)?;
let (mut rcode, at_2) = self.call_arith_eval(terms[1].as_ref(), 2)?;
+ let at_1 =
+ if let &Term::Var(ref vr, ref name) = terms[0].as_ref() {
+ ArithmeticTerm::Reg(
+ self.mark_non_callable(name.clone(), 1, term_loc, vr, code)
+ )
+ } else {
+ at_1.unwrap_or(interm!(1))
+ };
+
+ let at_2 =
+ if let &Term::Var(ref vr, ref name) = terms[1].as_ref() {
+ ArithmeticTerm::Reg(
+ self.mark_non_callable(name.clone(), 2, term_loc, vr, code)
+ )
+ } else {
+ at_2.unwrap_or(interm!(2))
+ };
+
code.append(&mut lcode);
code.append(&mut rcode);
- code.push(compare_number_instr!(
- cmp,
- at_1.unwrap_or(interm!(1)),
- at_2.unwrap_or(interm!(2))
- ));
+ code.push(compare_number_instr!(cmp, at_1, at_2));
}
&InlinedClauseType::IsAtom(..) => match terms[0].as_ref() {
- &Term::Constant(_, Constant::Char(_))
- | &Term::Constant(_, Constant::EmptyList)
- | &Term::Constant(_, Constant::Atom(..)) => {
+ &Term::Constant(_, Constant::Char(_)) |
+ &Term::Constant(_, Constant::EmptyList) |
+ &Term::Constant(_, Constant::Atom(..)) => {
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_atom!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_atomic!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_compound!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_rational!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_float!(r));
}
code.push(fail!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_nonvar!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_integer!(r));
}
code.push(succeed!());
}
&Term::Var(ref vr, ref name) => {
+ self.marker.reset_arg(1);
let r = self.mark_non_callable(name.clone(), 1, term_loc, vr, code);
code.push(is_var!(r));
}
term: &'a Term,
target_int: usize,
) -> Result<ArithCont, ArithmeticError> {
- let mut evaluator = ArithmeticEvaluator::new(self.marker.bindings(), target_int);
+ let mut evaluator = ArithmeticEvaluator::new(&self.marker.bindings(), target_int);
evaluator.eval(term)
}
let (mut acode, at) = self.call_arith_eval(terms[1].as_ref(), 1)?;
code.append(&mut acode);
- Ok(match terms[0].as_ref() {
+ self.marker.reset_arg(2);
+
+ match terms[0].as_ref() {
&Term::Var(ref vr, ref name) => {
let mut target = vec![];
- self.marker.reset_arg(2);
- self.marker
- .mark_var(name.clone(), Level::Shallow, vr, term_loc, &mut target);
+ self.marker.mark_var(name.clone(), Level::Shallow, vr, term_loc, &mut target);
if !target.is_empty() {
code.extend(target.into_iter().map(Line::Query));
}
-
- if use_default_call_policy {
- code.push(is_call_by_default!(temp_v!(1), at.unwrap_or(interm!(1))))
- } else {
- code.push(is_call!(temp_v!(1), at.unwrap_or(interm!(1))))
- }
}
&Term::Constant(_, ref c @ Constant::Integer(_)) |
&Term::Constant(_, ref c @ Constant::Fixnum(_)) => {
temp_v!(1)
)));
- if use_default_call_policy {
- code.push(is_call_by_default!(temp_v!(1), at.unwrap_or(interm!(1))))
- } else {
- code.push(is_call!(temp_v!(1), at.unwrap_or(interm!(1))))
- }
+ self.marker.advance_arg();
}
&Term::Constant(_, ref c @ Constant::Float(_)) => {
code.push(Line::Query(put_constant!(
temp_v!(1)
)));
- if use_default_call_policy {
- code.push(is_call_by_default!(temp_v!(1), at.unwrap_or(interm!(1))))
- } else {
- code.push(is_call!(temp_v!(1), at.unwrap_or(interm!(1))))
- }
+ self.marker.advance_arg();
}
&Term::Constant(_, ref c @ Constant::Rational(_)) => {
code.push(Line::Query(put_constant!(
temp_v!(1)
)));
- if use_default_call_policy {
- code.push(is_call_by_default!(temp_v!(1), at.unwrap_or(interm!(1))))
- } else {
- code.push(is_call!(temp_v!(1), at.unwrap_or(interm!(1))))
- }
+ self.marker.advance_arg();
+ }
+ _ => {
+ code.push(fail!());
+ return Ok(());
}
- _ => code.push(fail!()),
+ }
+
+ let at =
+ if let &Term::Var(ref vr, ref name) = terms[1].as_ref() {
+ ArithmeticTerm::Reg(
+ self.mark_non_callable(name.clone(), 2, term_loc, vr, code)
+ )
+ } else {
+ at.unwrap_or(interm!(1))
+ };
+
+ Ok(if use_default_call_policy {
+ code.push(is_call_by_default!(temp_v!(1), at));
+ } else {
+ code.push(is_call!(temp_v!(1), at));
})
}