(use (only srfi-14 char-set:digit) comparse) (define digit (in char-set:digit)) (define (as-number parser) (bind (as-string parser) (lambda (s) (result (string->number s))))) (define digits (as-number (one-or-more digit))) (define timestamp-hours (sequence* ((hours digits) (_ (is #\h))) (result hours))) (define timestamp-minutes (sequence* ((minutes digits) (_ (is #\m))) (result minutes))) (define timestamp-seconds (sequence* ((seconds digits) (_ (is #\s))) (result seconds))) (define timestamp (sequence* ((hours (maybe timestamp-hours)) (minutes (maybe timestamp-minutes)) (seconds timestamp-seconds)) (result (list (or hours 0) (or minutes 0) seconds)))) (define (parse-timestamp input) (parse (followed-by timestamp end-of-input) input)) (parse-timestamp "1s") ;=> (0 0 1) (parse-timestamp "1m2s") ;=> (0 1 2) (parse-timestamp "1h2m3s") ;=> (1 2 3)