mark cyclic lists with ellipses at the head (#2635)

This commit is contained in:
Mark Thom
2025-04-10 22:39:35 -07:00
parent 8558bd2214
commit 1b22c89211

View File

@@ -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;