From: Mark Thom Date: Thu, 18 Mar 2021 01:27:53 +0000 (-0600) Subject: always print variable bindings before names (#865) X-Git-Tag: v0.9.0~122 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=6c23d7aec8b09ee49a4e04b774c65941a546c44a;p=scryer-prolog.git always print variable bindings before names (#865) --- diff --git a/src/heap_print.rs b/src/heap_print.rs index 950b3ecd..52e0e2ae 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -831,21 +831,16 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { } match self.heap_locs.get(&addr).cloned() { - Some(var) => { - if !self.printed_vars.contains(&addr) { - self.printed_vars.insert(addr); - return iter.next(); - } else { - iter.stack().pop(); + Some(var) if addr.is_ref() => { + iter.stack().pop(); - push_space_if_amb!(self, &var, { - self.append_str(&var); - }); + push_space_if_amb!(self, &var, { + self.append_str(&var); + }); - return None; - } + return None; } - None => { + var_opt => { let offset = match functor_location(&addr) { Some(offset) => offset, None => { @@ -858,17 +853,32 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { if reps > 0 { self.cyclic_terms.insert(addr, reps - 1); } else { - push_space_if_amb!(self, "...", { - self.append_str("..."); - }); - - iter.stack().pop(); - self.cyclic_terms.insert(addr, 2); + match var_opt { + Some(var) => { + push_space_if_amb!(self, &var, { + self.append_str(&var); + }); + + iter.stack().pop(); + } + None => { + push_space_if_amb!(self, "...", { + self.append_str("..."); + }); + + iter.stack().pop(); + self.cyclic_terms.insert(addr, 2); + } + } return None; } } else if self.machine_st.is_cyclic_term(addr.clone()) { - self.cyclic_terms.insert(addr, 2); + if var_opt.is_some() { + self.cyclic_terms.insert(addr, 0); + } else { + self.cyclic_terms.insert(addr, 2); + } } else { self.record_children_as_non_cyclic(&addr); self.non_cyclic_terms.insert(offset);