; extract number from string

(define (extract-number str)
  (let loop ((cs (string->list str)) (prev #\X) (n 0))
    (cond ((null? cs)
            (* (if (char=? prev #\-) -1 1) n))
          ((char-numeric? (car cs))
            (loop (cdr cs) prev
                  (+ (* n 10)
                     (- (char->integer (car cs))
                        (char->integer #\0)))))
          ((positive? n)
            (* (if (char=? prev #\-) -1 1) n))
          (else (loop (cdr cs) (car cs) n)))))

(display (extract-number "-123")) (newline)
(display (extract-number "-123junk")) (newline)
(display (extract-number "junk-123")) (newline)
(display (extract-number "junk-123junk")) (newline)
(display (extract-number "junk-123junk456")) (newline)
(display (extract-number "junk123junk456")) (newline)