From: Mark Thom Date: Mon, 7 May 2018 06:44:42 +0000 (-0600) Subject: record cyclic terms in printer X-Git-Tag: v0.8.110~466 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=7573a8fb1075c0c3d30d81e58532d49f8f7f58e4;p=scryer-prolog.git record cyclic terms in printer --- diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 54e70ced..2d027732 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -183,16 +183,20 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter> printer } - fn print_offset(&mut self, addr: Addr) { + fn offset_as_string(&self, addr: Addr) -> Option { match addr { Addr::HeapCell(h) | Addr::Lis(h) | Addr::Str(h) => - self.outputter.append(format!("_{}", h).as_str()), + Some(format!("_{}", h)), Addr::StackCell(fr, sc) => - self.outputter.append(format!("s_{}_{}", fr, sc).as_str()), - _ => {} + Some(format!("s_{}_{}", fr, sc)), + _ => None } } + fn print_offset(&mut self, addr: Addr) { + self.offset_as_string(addr).map(|s| self.outputter.append(s.as_str())); + } + fn check_for_seen(&mut self, iter: &mut HCPreOrderIterator) -> Option { iter.stack().last().cloned().and_then(|addr| { let addr = self.machine_st.store(self.machine_st.deref(addr)); @@ -214,6 +218,11 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter> None } else { + if let Some(s) = self.offset_as_string(addr.clone()) { + let var = Rc::new(s); + self.heap_locs.insert(addr.clone(), var); + } + self.printed_vars.insert(addr); iter.next() }