#lang debug racket (require racket/string "main.rkt" "kernscore.rkt") (module+ raco (define command-name (with-handlers ([exn:fail? (λ (exn) #f)]) (vector-ref (current-command-line-arguments) 0))) (dispatch command-name)) (module+ main (println "this is words command")) (define (dispatch command-name) (define letters "abcdefghijklmnopqrstuvwxyz") (define mandatory #false) (define combo #false) (define min-size 5) (define max-size 10) (define count 20) (define hide-plurals #true) (define proper-names #false) (define title-case #false) (define uppercase #false) (define sort-style #false) (define omit #false) (define reversed #false) (command-line #:program "words" #:argv (current-command-line-arguments) #:once-each [("-l" "--letters") letters-arg "possible letters (default is a-z)" (set! letters letters-arg)] [("-m" "--mandatory") mandatory-arg "mandatory letters" (set! mandatory mandatory-arg)] [("-o" "--omit") omit-arg "forbidden letters" (set! omit omit-arg)] [("-c" "--combo") combo-arg "mandatory combo" (set! combo combo-arg)] [("-n" "--number") count-arg "max number of results" (set! count (string->number count-arg))] [("--min") min-size-arg "minimum word length" (set! min-size (string->number min-size-arg))] [("--max") max-size-arg "maximum word length" (set! max-size (string->number max-size-arg))] [("-s" "--show-plurals") "show plural words" (set! hide-plurals #false)] [("-p" "--proper-names") "show proper names" (set! proper-names #true)] [("--sort") sort-arg "sort order" (set! sort-style sort-arg)] [("-r" "--reverse") "reverse order" (set! reversed #true)] #:once-any [("-t" "--title-case") "capitalize first letter" (set! title-case #true)] [("-u" "--uppercase") "capitalize all letters" (set! uppercase #true)]) (define words (make-words #:letters letters #:mandatory mandatory #:omit omit #:combo combo #:count count #:min min-size #:max max-size #:hide-plurals hide-plurals #:proper-names proper-names #:case (cond [uppercase 'upper] [title-case 'title] [else #false]))) (define-values (sort-key sort-cmp) (match sort-style ["kernscore" (values kernscore <)] ["alpha" (values values string<=?)] [_ (values #false #false)])) (define sorted-words (cond [sort-key (sort words sort-cmp #:key sort-key #:cache-keys? #true)] [else words])) (displayln (string-join ((if reversed reverse values) sorted-words) "\n")))