From 1b22c89211bd87537a110f9e7542b579e9ed10c5 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 10 Apr 2025 22:39:35 -0700 Subject: [PATCH] mark cyclic lists with ellipses at the head (#2635) --- src/heap_print.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/heap_print.rs b/src/heap_print.rs index 3c22f0ae..f6f0c8f3 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -874,12 +874,16 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { None => { if self.max_depth == 0 || *max_depth == 0 { // otherwise, contract it to an ellipsis. - push_space_if_amb!(self, "...", { - append_str!(self, "..."); - }); + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); } else { debug_assert!(cell.is_ref()); + let h = cell.get_value() as usize; + self.iter.push_stack(IterStackLoc::iterable_loc( + h, + HeapOrStackTag::Heap, + )); + // as usual, the WAM's // optimization of the Lis tag // (conflating the location of @@ -889,15 +893,17 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { // lest we find ourselves in // an infinite loop. if cell.get_tag() == HeapCellValueTag::Lis { - *max_depth -= 1; + if self.iter.heap[cell.get_value() as usize] + .get_forwarding_bit() + { + self.state_stack + .push(TokenOrRedirect::Atom(atom!("..."))); + return None; + } else { + *max_depth -= 1; + } } - let h = cell.get_value() as usize; - self.iter.push_stack(IterStackLoc::iterable_loc( - h, - HeapOrStackTag::Heap, - )); - if let Some(cell) = self.iter.next() { orig_cell = cell; continue; -- 2.54.0