;; Display that handles circular lists. (1.01)
(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 (y) (eq? x y)) seen)))
(display "#"))
; List.
(else
(display "(")
(let loop-inner ((x x) (seen seen) (separator ""))
(cond
((null? x)
#f)
((or (not (pair? x)) (memq x seen))
(display " . ")
(loop-outer x seen))
(else
(display separator)
(loop-outer (car x) (cons x seen))
(loop-inner (cdr x) (cons x 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#))
OzsgRGlzcGxheSB0aGF0IGhhbmRsZXMgY2lyY3VsYXIgbGlzdHMuICgxLjAxKQoKKHVzZSBzcmZpLTEpCgooZGVmaW5lIChteS1kaXNwbGF5IHgpCiAgKGxldCBsb29wLW91dGVyICgoeCB4KSAoc2VlbiAnKCkpKQogICAgKGNvbmQKICAgICA7IEF0b20uCiAgICAgKChub3QgKHBhaXI/IHgpKQogICAgICAoZGlzcGxheSB4KSkKICAgICA7IEN5Y2xlLgogICAgICgobWVtcSB4IHNlZW4pCiAgICAgIChkaXNwbGF5ICIjIikKICAgICAgKGRpc3BsYXkgKC0gKGxpc3QtaW5kZXggKGxhbWJkYSAoeSkgKGVxPyB4IHkpKSBzZWVuKSkpCiAgICAgIChkaXNwbGF5ICIjIikpCiAgICAgOyBMaXN0LgogICAgIChlbHNlCiAgICAgIChkaXNwbGF5ICIoIikKICAgICAgKGxldCBsb29wLWlubmVyICgoeCB4KSAoc2VlbiBzZWVuKSAoc2VwYXJhdG9yICIiKSkKICAgICAgICAoY29uZAogICAgICAgICAoKG51bGw/IHgpCiAgICAgICAgICAjZikKICAgICAgICAgKChvciAobm90IChwYWlyPyB4KSkgKG1lbXEgeCBzZWVuKSkKICAgICAgICAgIChkaXNwbGF5ICIgLiAiKQogICAgICAgICAgKGxvb3Atb3V0ZXIgeCBzZWVuKSkKICAgICAgICAgKGVsc2UKICAgICAgICAgIChkaXNwbGF5IHNlcGFyYXRvcikKICAgICAgICAgIChsb29wLW91dGVyIChjYXIgeCkgKGNvbnMgeCBzZWVuKSkKICAgICAgICAgIChsb29wLWlubmVyIChjZHIgeCkgKGNvbnMgeCBzZWVuKSAiICIpKSkpCiAgICAgIChkaXNwbGF5ICIpIikpKSkpCgooZGVmaW5lIChkaXNwbGF5LW5sIGZpcnN0IC4gcmVzdCkKICAobXktZGlzcGxheSBmaXJzdCkKICAoZm9yLWVhY2ggKGxhbWJkYSAoeCkgKG15LWRpc3BsYXkgIiwgIikgKG15LWRpc3BsYXkgeCkpIHJlc3QpCiAgKG5ld2xpbmUpKQoKOzsgU2hvdy4KCihkZWZpbmUgKG1ha2UtY3ljbGUgeCkKICAoc2V0LWNkciEgKGxhc3QtcGFpciB4KSB4KQogIHgpCgooZGlzcGxheS1ubCAobGlzdCkpCihkaXNwbGF5LW5sIChsaXN0IChsaXN0KSkpCihkaXNwbGF5LW5sIChsaXN0IChsaXN0IChsaXN0KSkpKQooZGlzcGxheS1ubCAoY29ucyAxIDIpKQoKKGRlZmluZSB4IChpb3RhIDEpKQooZGVmaW5lIHkgKGlvdGEgMikpCihkZWZpbmUgeiAoaW90YSAzKSkKCihkaXNwbGF5LW5sIHggeSB6KQooZGlzcGxheS1ubCAobWFrZS1jeWNsZSB4KSkKKGRpc3BsYXktbmwgKG1ha2UtY3ljbGUgeSkpCihkaXNwbGF5LW5sIChtYWtlLWN5Y2xlIHopKQoKKGRlZmluZSB4IChpb3RhIDEpKQooc2V0LWNhciEgeCB4KQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDIpKQooc2V0LWNhciEgeCB4KQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDIpKQooc2V0LWNhciEgKGNkciB4KSB4KQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDIpKQooc2V0LWNhciEgKGNkciB4KSAoY2RyIHgpKQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDMpKQooc2V0LWNhciEgKGNkZHIgeCkgeCkKKGRpc3BsYXktbmwgeCkKCihkZWZpbmUgeCAoaW90YSAzKSkKKHNldC1jYXIhIChjZGRyIHgpIChjZHIgeCkpCihkaXNwbGF5LW5sIHgpCgooZGVmaW5lIHggKGlvdGEgMykpCihkZWZpbmUgeSAoaW90YSAzKSkKKHNldC1jZHIhIChjZGRyIHgpIHkpCihzZXQtY2FyISAoY2RkciB4KSB4KQooZGlzcGxheS1ubCB4KQoKKGRlZmluZSB4IChpb3RhIDMpKQooZGVmaW5lIHkgKGlvdGEgMykpCihzZXQtY2RyISAoY2RkciB4KSB5KQooc2V0LWNhciEgKGNkZHIgeSkgeCkKKGRpc3BsYXktbmwgeCkKKGRpc3BsYXktbmwgeSkKCjs7IEV4cGVjdGVkIG91dHB1dC4KCjsoKQo7KCgpKQo7KCgoKSkpCjsoMSAuIDIpCjsoMCksICgwIDEpLCAoMCAxIDIpCjsoMCAuICMwIykKOygwIDEgLiAjLTEjKQo7KDAgMSAyIC4gIy0yIykKOygjMCMpCjsoIzAjIDEpCjsoMCAjLTEjKQo7KDAgIzAjKQo7KDAgMSAjLTIjKQo7KDAgMSAjLTEjKQo7KDAgMSAjLTIjIDAgMSAyKQo7KDAgMSAyIDAgMSAjLTUjKQo7KDAgMSAoMCAxIDIgLiAjLTUjKSk=