#lang scheme/base (provide valid-version? version->list versionlist str) (let ([ver (map string->number (regexp-split #rx"[.]" str))]) (case (length ver) [(2) (append ver '(0 0))] [(3) (append ver '(0))] [(4) ver] [else (error 'version->list "bad version: ~e" str)]))) (define (versionlist a)] [b (version->list b)]) (cond [(null? a) #f] [(< (car a) (car b)) #t] [(> (car a) (car b)) #f] [else (loop (cdr a) (cdr b))])))