; sum embedded numbers

(define (next-number xs)
  (let loop ((xs xs))
    (if (null? xs) (values #f #f)
      (if (not (char-numeric? (car xs)))
          (loop (cdr xs))
          (let loop ((xs xs) (n 0))
            (if (null? xs) (values n xs)
              (if (char-numeric? (car xs))
                  (loop (cdr xs)
                        (+ (* n 10)
                           (- (char->integer (car xs))
                              (char->integer #\0))))
                  (values n xs))))))))

(define (sum-embedded-numbers str)
  (let loop ((xs (string->list str)) (sum 0))
    (call-with-values
      (lambda () (next-number xs))
      (lambda (n xs)
        (if n (loop xs (+ sum n)) sum)))))

(display (sum-embedded-numbers "11aa22bb33cc44")) (newline)