; stock prices, fixed

(define xs '(100 80 70 65 95 120 150 75 95 100 110 120 90 80 85 90 64))

(define (buy-sell xs)
  (let loop ((xs (cdr xs)) (lo (car xs)) (hi (car xs))
             (min-lo (car xs)) (max-d 0))
    (if (null? xs) (values lo hi max-d)
      (let* ((min-lo (if (< (car xs) min-lo) (car xs) min-lo))
             (d (- (car xs) min-lo)))
        (if (< max-d d)
          (loop (cdr xs) min-lo (car xs) min-lo d)
          (loop (cdr xs) lo hi min-lo max-d))))))

(call-with-values
  (lambda () (buy-sell xs))
  (lambda (lo hi diff)
    (display lo) (newline)
    (display hi) (newline)
    (display diff) (newline)))