; squares of a sorted array

(define (square x) (* x x))

(display (sort (map square '(-4 -1 0 3 10)) <)) (newline)

(define (sq-sort xv)
  (let loop ((lo 0) (hi (- (vector-length xv) 1)) (xs (list)))
    (if (= lo hi) (cons (square (vector-ref xv lo)) xs)
      (if (< (abs (vector-ref xv lo)) (abs (vector-ref xv hi)))
          (loop lo (- hi 1) (cons (square (vector-ref xv hi)) xs))
          (loop (+ lo 1) hi (cons (square (vector-ref xv lo)) xs))))))

(display  (sq-sort '#(-4 -1 0 3 10))) (newline)