; local maxima
(define (lmax xs)
(if (null? xs) (error 'lmax "empty")
(let loop ((xs (cdr xs)) (prev (car xs)) (dir 'up) (maxs (list)))
(cond ((null? xs)
(reverse (if (equal? dir 'up) (cons prev maxs) maxs)))
((= prev (car xs)) (loop (cdr xs) prev dir maxs))
((< prev (car xs)) (loop (cdr xs) (car xs) 'up maxs))
((equal? dir 'up) (loop (cdr xs) (car xs) 'down (cons prev maxs)))
(else (loop (cdr xs) (car xs) 'down maxs))))))
(display (lmax '(1 2 1 2 3 4 3 2 3 2 1))) (newline)
OyBsb2NhbCBtYXhpbWEKCihkZWZpbmUgKGxtYXggeHMpCiAgKGlmIChudWxsPyB4cykgKGVycm9yICdsbWF4ICJlbXB0eSIpCiAgICAobGV0IGxvb3AgKCh4cyAoY2RyIHhzKSkgKHByZXYgKGNhciB4cykpIChkaXIgJ3VwKSAobWF4cyAobGlzdCkpKQogICAgICAoY29uZCAoKG51bGw/IHhzKQogICAgICAgICAgICAgIChyZXZlcnNlIChpZiAoZXF1YWw/IGRpciAndXApIChjb25zIHByZXYgbWF4cykgbWF4cykpKQogICAgICAgICAgICAoKD0gcHJldiAoY2FyIHhzKSkgKGxvb3AgKGNkciB4cykgcHJldiBkaXIgbWF4cykpCiAgICAgICAgICAgICgoPCBwcmV2IChjYXIgeHMpKSAobG9vcCAoY2RyIHhzKSAoY2FyIHhzKSAndXAgbWF4cykpCiAgICAgICAgICAgICgoZXF1YWw/IGRpciAndXApIChsb29wIChjZHIgeHMpIChjYXIgeHMpICdkb3duIChjb25zIHByZXYgbWF4cykpKQogICAgICAgICAgICAoZWxzZSAobG9vcCAoY2RyIHhzKSAoY2FyIHhzKSAnZG93biBtYXhzKSkpKSkpCgooZGlzcGxheSAobG1heCAnKDEgMiAxIDIgMyA0IDMgMiAzIDIgMSkpKSAobmV3bGluZSk=