From 6c23d7aec8b09ee49a4e04b774c65941a546c44a Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 17 Mar 2021 19:27:53 -0600 Subject: [PATCH] always print variable bindings before names (#865) --- src/heap_print.rs | 48 ++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) 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); -- 2.54.0