; 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)
OyBleHRyYWN0IG51bWJlciBmcm9tIHN0cmluZwoKKGRlZmluZSAoZXh0cmFjdC1udW1iZXIgc3RyKQogIChsZXQgbG9vcCAoKGNzIChzdHJpbmctPmxpc3Qgc3RyKSkgKHByZXYgI1xYKSAobiAwKSkKICAgIChjb25kICgobnVsbD8gY3MpCiAgICAgICAgICAgICgqIChpZiAoY2hhcj0/IHByZXYgI1wtKSAtMSAxKSBuKSkKICAgICAgICAgICgoY2hhci1udW1lcmljPyAoY2FyIGNzKSkKICAgICAgICAgICAgKGxvb3AgKGNkciBjcykgcHJldgogICAgICAgICAgICAgICAgICAoKyAoKiBuIDEwKQogICAgICAgICAgICAgICAgICAgICAoLSAoY2hhci0+aW50ZWdlciAoY2FyIGNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXItPmludGVnZXIgI1wwKSkpKSkKICAgICAgICAgICgocG9zaXRpdmU/IG4pCiAgICAgICAgICAgICgqIChpZiAoY2hhcj0/IHByZXYgI1wtKSAtMSAxKSBuKSkKICAgICAgICAgIChlbHNlIChsb29wIChjZHIgY3MpIChjYXIgY3MpIG4pKSkpKQoKKGRpc3BsYXkgKGV4dHJhY3QtbnVtYmVyICItMTIzIikpIChuZXdsaW5lKQooZGlzcGxheSAoZXh0cmFjdC1udW1iZXIgIi0xMjNqdW5rIikpIChuZXdsaW5lKQooZGlzcGxheSAoZXh0cmFjdC1udW1iZXIgImp1bmstMTIzIikpIChuZXdsaW5lKQooZGlzcGxheSAoZXh0cmFjdC1udW1iZXIgImp1bmstMTIzanVuayIpKSAobmV3bGluZSkKKGRpc3BsYXkgKGV4dHJhY3QtbnVtYmVyICJqdW5rLTEyM2p1bms0NTYiKSkgKG5ld2xpbmUpCihkaXNwbGF5IChleHRyYWN0LW51bWJlciAianVuazEyM2p1bms0NTYiKSkgKG5ld2xpbmUp