;; Display that handles circular lists.
(use srfi-1)
(define (my-display x)
(let loop-outer ((x x) (seen '()))
(cond
; Atom.
((not (pair? x))
(display x))
; Cycle.
((memq x seen)
(display "#")
(display (- (list-index (lambda (z) (eq? x z)) seen)))
(display "#"))
; List.
(else
(display "(")
(let loop-inner ((y x) (seen seen))
(cond
((null? y)
#f)
((or (not (pair? y)) (memq y seen))
(display " . ")
(loop-outer y seen))
(else
(display (if (eq? x y) "" " "))
(loop-outer (car y) (cons y seen))
(loop-inner (cdr y) (cons y seen)))))
(display ")")))))
(define (display-nl first . rest)
(my-display first)
(for-each (lambda (x) (my-display ", ") (my-display x)) rest)
(newline))
;; Show.
(define (make-cycle x)
(set-cdr! (last-pair x) x)
x)
(display-nl (list))
(display-nl (list (list)))
(display-nl (list (list (list))))
(display-nl (cons 1 2))
(define x (iota 1))
(define y (iota 2))
(define z (iota 3))
(display-nl x y z)
(display-nl (make-cycle x))
(display-nl (make-cycle y))
(display-nl (make-cycle z))
(define x (iota 1))
(set-car! x x)
(display-nl x)
(define x (iota 2))
(set-car! x x)
(display-nl x)
(define x (iota 2))
(set-car! (cdr x) x)
(display-nl x)
(define x (iota 2))
(set-car! (cdr x) (cdr x))
(display-nl x)
(define x (iota 3))
(set-car! (cddr x) x)
(display-nl x)
(define x (iota 3))
(set-car! (cddr x) (cdr x))
(display-nl x)
(define x (iota 3))
(define y (iota 3))
(set-cdr! (cddr x) y)
(set-car! (cddr x) x)
(display-nl x)
(define x (iota 3))
(define y (iota 3))
(set-cdr! (cddr x) y)
(set-car! (cddr y) x)
(display-nl x)
(display-nl y)
;; Expected output.
;()
;(())
;((()))
;(1 . 2)
;(0), (0 1), (0 1 2)
;(0 . #0#)
;(0 1 . #-1#)
;(0 1 2 . #-2#)
;(#0#)
;(#0# 1)
;(0 #-1#)
;(0 #0#)
;(0 1 #-2#)
;(0 1 #-1#)
;(0 1 #-2# 0 1 2)
;(0 1 2 0 1 #-5#)
;(0 1 (0 1 2 . #-5#))
OzsgRGlzcGxheSB0aGF0IGhhbmRsZXMgY2lyY3VsYXIgbGlzdHMuCgoodXNlIHNyZmktMSkKCihkZWZpbmUgKG15LWRpc3BsYXkgeCkKICAobGV0IGxvb3Atb3V0ZXIgKCh4IHgpIChzZWVuICcoKSkpCiAgICAoY29uZAogICAgIDsgQXRvbS4KICAgICAoKG5vdCAocGFpcj8geCkpCiAgICAgIChkaXNwbGF5IHgpKQogICAgIDsgQ3ljbGUuCiAgICAgKChtZW1xIHggc2VlbikKICAgICAgKGRpc3BsYXkgIiMiKQogICAgICAoZGlzcGxheSAoLSAobGlzdC1pbmRleCAobGFtYmRhICh6KSAoZXE/IHggeikpIHNlZW4pKSkKICAgICAgKGRpc3BsYXkgIiMiKSkKICAgICA7IExpc3QuCiAgICAgKGVsc2UKICAgICAgKGRpc3BsYXkgIigiKQogICAgICAobGV0IGxvb3AtaW5uZXIgKCh5IHgpIChzZWVuIHNlZW4pKQogICAgICAgIChjb25kCiAgICAgICAgICgobnVsbD8geSkKICAgICAgICAgICNmKQogICAgICAgICAoKG9yIChub3QgKHBhaXI/IHkpKSAobWVtcSB5IHNlZW4pKQogICAgICAgICAgKGRpc3BsYXkgIiAuICIpCiAgICAgICAgICAobG9vcC1vdXRlciB5IHNlZW4pKQogICAgICAgICAoZWxzZQogICAgICAgICAgKGRpc3BsYXkgKGlmIChlcT8geCB5KSAiIiAiICIpKQogICAgICAgICAgKGxvb3Atb3V0ZXIgKGNhciB5KSAoY29ucyB5IHNlZW4pKQogICAgICAgICAgKGxvb3AtaW5uZXIgKGNkciB5KSAoY29ucyB5IHNlZW4pKSkpKQogICAgICAoZGlzcGxheSAiKSIpKSkpKQoKKGRlZmluZSAoZGlzcGxheS1ubCBmaXJzdCAuIHJlc3QpCiAgKG15LWRpc3BsYXkgZmlyc3QpCiAgKGZvci1lYWNoIChsYW1iZGEgKHgpIChteS1kaXNwbGF5ICIsICIpIChteS1kaXNwbGF5IHgpKSByZXN0KQogIChuZXdsaW5lKSkKCjs7IFNob3cuCgooZGVmaW5lIChtYWtlLWN5Y2xlIHgpCiAgKHNldC1jZHIhIChsYXN0LXBhaXIgeCkgeCkKICB4KQoKKGRpc3BsYXktbmwgKGxpc3QpKQooZGlzcGxheS1ubCAobGlzdCAobGlzdCkpKQooZGlzcGxheS1ubCAobGlzdCAobGlzdCAobGlzdCkpKSkKKGRpc3BsYXktbmwgKGNvbnMgMSAyKSkKCihkZWZpbmUgeCAoaW90YSAxKSkKKGRlZmluZSB5IChpb3RhIDIpKQooZGVmaW5lIHogKGlvdGEgMykpCgooZGlzcGxheS1ubCB4IHkgeikKKGRpc3BsYXktbmwgKG1ha2UtY3ljbGUgeCkpCihkaXNwbGF5LW5sIChtYWtlLWN5Y2xlIHkpKQooZGlzcGxheS1ubCAobWFrZS1jeWNsZSB6KSkKCihkZWZpbmUgeCAoaW90YSAxKSkKKHNldC1jYXIhIHggeCkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAyKSkKKHNldC1jYXIhIHggeCkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAyKSkKKHNldC1jYXIhIChjZHIgeCkgeCkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAyKSkKKHNldC1jYXIhIChjZHIgeCkgKGNkciB4KSkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAzKSkKKHNldC1jYXIhIChjZGRyIHgpIHgpCihkaXNwbGF5LW5sIHgpCgooZGVmaW5lIHggKGlvdGEgMykpCihzZXQtY2FyISAoY2RkciB4KSAoY2RyIHgpKQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDMpKQooZGVmaW5lIHkgKGlvdGEgMykpCihzZXQtY2RyISAoY2RkciB4KSB5KQooc2V0LWNhciEgKGNkZHIgeCkgeCkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAzKSkKKGRlZmluZSB5IChpb3RhIDMpKQooc2V0LWNkciEgKGNkZHIgeCkgeSkKKHNldC1jYXIhIChjZGRyIHkpIHgpCihkaXNwbGF5LW5sIHgpCihkaXNwbGF5LW5sIHkpCgo7OyBFeHBlY3RlZCBvdXRwdXQuCgo7KCkKOygoKSkKOygoKCkpKQo7KDEgLiAyKQo7KDApLCAoMCAxKSwgKDAgMSAyKQo7KDAgLiAjMCMpCjsoMCAxIC4gIy0xIykKOygwIDEgMiAuICMtMiMpCjsoIzAjKQo7KCMwIyAxKQo7KDAgIy0xIykKOygwICMwIykKOygwIDEgIy0yIykKOygwIDEgIy0xIykKOygwIDEgIy0yIyAwIDEgMikKOygwIDEgMiAwIDEgIy01IykKOygwIDEgKDAgMSAyIC4gIy01Iykp