; summing a string

(define (sum-string str)
  (let loop ((cs (string->list str)) (curr 0) (sum 0))
    (cond ((null? cs) (+ curr sum))
          ((char-numeric? (car cs))
            (loop (cdr cs)
                  (+ (* curr 10)
                     (char->integer (car cs))
                     (- (char->integer #\0)))
                  sum))
          ((positive? curr)
            (loop (cdr cs) 0 (+ curr sum)))
          (else (loop (cdr cs) 0 sum)))))

(display (sum-string "123abc45def")) (newline)
(display (sum-string "123abc45")) (newline)
(display (sum-string "abc123def45ghi")) (newline)
(display (sum-string "abcde")) (newline)