; second largest item
(define (second-max lt? xs)
(if (or (null? xs) (null? (cdr xs)))
(error 'second-max "not enough data")
(begin
(when (lt? (car xs) (cadr xs))
(set! xs (cons (cadr xs) (cons (car xs) (cddr xs)))))
(let loop ((first (car xs)) (second (cadr xs)) (xs (cddr xs)))
(cond ((null? xs) second)
((lt? second (car xs))
(if (lt? first (car xs))
(loop (car xs) first (cdr xs))
(loop first (car xs) (cdr xs))))
(else (loop first second (cdr xs))))))))
(display (second-max < '(4 1 9 2 3 8 5 7 6))) (newline)
OyBzZWNvbmQgbGFyZ2VzdCBpdGVtCgooZGVmaW5lIChzZWNvbmQtbWF4IGx0PyB4cykKICAoaWYgKG9yIChudWxsPyB4cykgKG51bGw/IChjZHIgeHMpKSkKICAgICAgKGVycm9yICdzZWNvbmQtbWF4ICJub3QgZW5vdWdoIGRhdGEiKQogICAgICAoYmVnaW4KICAgICAgICAod2hlbiAobHQ/IChjYXIgeHMpIChjYWRyIHhzKSkKICAgICAgICAgIChzZXQhIHhzIChjb25zIChjYWRyIHhzKSAoY29ucyAoY2FyIHhzKSAoY2RkciB4cykpKSkpCiAgICAgICAgKGxldCBsb29wICgoZmlyc3QgKGNhciB4cykpIChzZWNvbmQgKGNhZHIgeHMpKSAoeHMgKGNkZHIgeHMpKSkKICAgICAgICAgIChjb25kICgobnVsbD8geHMpIHNlY29uZCkKICAgICAgICAgICAgICAgICgobHQ/IHNlY29uZCAoY2FyIHhzKSkKICAgICAgICAgICAgICAgICAgKGlmIChsdD8gZmlyc3QgKGNhciB4cykpCiAgICAgICAgICAgICAgICAgICAgICAobG9vcCAoY2FyIHhzKSBmaXJzdCAoY2RyIHhzKSkKICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZpcnN0IChjYXIgeHMpIChjZHIgeHMpKSkpCiAgICAgICAgICAgICAgICAoZWxzZSAobG9vcCBmaXJzdCBzZWNvbmQgKGNkciB4cykpKSkpKSkpCgooZGlzcGxheSAoc2Vjb25kLW1heCA8ICcoNCAxIDkgMiAzIDggNSA3IDYpKSkgKG5ld2xpbmUp