; reverse a linked list
(define xs '(1 2 3 4 5 6 7))
(display (reverse xs)) (newline)
(display xs) (newline)
(define (rev xs)
(let loop ((xs xs) (zs (list)))
(if (null? xs) zs
(loop (cdr xs) (cons (car xs) zs)))))
(display (rev xs)) (newline)
(display xs) (newline)
(define (rev! xs)
(let loop ((prev (list)) (curr xs))
(if (null? curr) prev
(let ((next (cdr curr)))
(set-cdr! curr prev)
(loop curr next)))))
(set! xs (rev! xs)) (display xs) (newline)
(set! xs (rev! xs)) (display xs) (newline)
OyByZXZlcnNlIGEgbGlua2VkIGxpc3QKCihkZWZpbmUgeHMgJygxIDIgMyA0IDUgNiA3KSkKCihkaXNwbGF5IChyZXZlcnNlIHhzKSkgKG5ld2xpbmUpCihkaXNwbGF5IHhzKSAobmV3bGluZSkKCihkZWZpbmUgKHJldiB4cykKICAobGV0IGxvb3AgKCh4cyB4cykgKHpzIChsaXN0KSkpCiAgICAoaWYgKG51bGw/IHhzKSB6cwogICAgICAobG9vcCAoY2RyIHhzKSAoY29ucyAoY2FyIHhzKSB6cykpKSkpCgooZGlzcGxheSAocmV2IHhzKSkgKG5ld2xpbmUpCihkaXNwbGF5IHhzKSAobmV3bGluZSkKCihkZWZpbmUgKHJldiEgeHMpCiAgKGxldCBsb29wICgocHJldiAobGlzdCkpIChjdXJyIHhzKSkKICAgIChpZiAobnVsbD8gY3VycikgcHJldgogICAgICAobGV0ICgobmV4dCAoY2RyIGN1cnIpKSkKICAgICAgICAoc2V0LWNkciEgY3VyciBwcmV2KQogICAgICAgIChsb29wIGN1cnIgbmV4dCkpKSkpCgooc2V0ISB4cyAocmV2ISB4cykpIChkaXNwbGF5IHhzKSAobmV3bGluZSkKKHNldCEgeHMgKHJldiEgeHMpKSAoZGlzcGxheSB4cykgKG5ld2xpbmUp