; nearest pair

(define (nearest-pair xs target)
  (let ((pos (list)))
    (do ((i 0 (+ i 1)) (ys xs (cdr ys))) ((null? ys))
      (set! pos (cons (cons (car ys) i) pos)))
    (let loop ((i 0) (xs xs) (np #f) (dist #e1e9))
      (if (null? xs) np
        (let ((j (assoc (- target (car xs)) pos)))
          (cond ((not j) (loop (+ i 1) (cdr xs) np dist))
                ((= i (cdr j)) (loop (+ i 1) (cdr xs) np dist))
                ((< (abs (- i (cdr j))) dist)
                  (loop (+ i 1) (cdr xs) (cons (car xs) (car j)) (abs (- i (cdr j)))))
                (else (loop (+ i 1) (cdr xs) np dist))))))))

(display (nearest-pair '(1 5 3 6 4 2) 7)) (newline)