From: Mark Thom Date: Fri, 11 Apr 2025 05:39:35 +0000 (-0700) Subject: mark cyclic lists with ellipses at the head (#2635) X-Git-Tag: v0.10.0~58 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1b22c89211bd87537a110f9e7542b579e9ed10c5;p=scryer-prolog.git mark cyclic lists with ellipses at the head (#2635) --- 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;