diff --git a/racket/collects/raco/raco.rkt b/racket/collects/raco/raco.rkt index 06ca7b18a1..9bb08b102e 100644 --- a/racket/collects/raco/raco.rkt +++ b/racket/collects/raco/raco.rkt @@ -1,27 +1,38 @@ #lang racket/base (require "command-name.rkt" - "all-tools.rkt") + "all-tools.rkt" + racket/string) (module test racket/base) -(define (find-by-prefix hash str) - (let ([trie (make-hash)]) - (for ([key (in-hash-keys hash)]) - (for/fold ([trie trie]) ([c (string->list key)]) - (let ([next (hash-ref trie c (lambda () (make-hash)))]) - (if (hash-ref next #f #f) - (hash-set! next #f null) - (hash-set! next #f key)) - (hash-set! trie c next) - next))) - (let ([t (for/fold ([trie trie]) ([c (string->list str)]) - (and trie - (hash-ref trie c #f)))]) - (and t - (let ([s (hash-ref t #f #f)]) - (if (string? s) - (hash-ref hash s) - 'ambiguous)))))) +(define (filter-by-prefix hash str) + (for/hash ([key (in-hash-keys hash)] + #:when (string-prefix? key str)) + (values key (hash-ref hash key)))) + +(define (filter-importance hash) + (for/hash ([key (in-hash-keys hash)] + #:when (cadddr (hash-ref hash key))) + (values key (hash-ref hash key)))) + +; sort methods for show-tools +(define (alphabetic (or (cadddr a) -inf.0) + (or (cadddr b) -inf.0))) + +(define (show-tools msg tools all-tools (hash-count prefix-tools) 1)] [show-all? (cond [(null? cmdline) #f] @@ -46,20 +65,16 @@ (find-system-path 'run-file) (car cmdline)) #f] - [(or (hash-ref tools (car cmdline) #f) - (find-by-prefix tools (car cmdline))) - => (lambda (tool) - (if (eq? 'ambiguous tool) - (begin - (eprintf "~a: Ambiguous command prefix: ~a\n\n" - (find-system-path 'run-file) - (car cmdline)) - #f) - (parameterize ([current-command-line-arguments - (list->vector (cdr cmdline))] - [current-command-name (car tool)]) - (dynamic-require (cadr tool) #f) - (done))))] + [tool + (parameterize ([current-command-line-arguments (list->vector (cdr cmdline))] + [current-command-name (car tool)]) + (dynamic-require (cadr tool) #f) + (done))] + [ambiguous? + (eprintf "~a: Ambiguous command prefix: ~a\n\n" + (find-system-path 'run-file) + (car cmdline)) + #f] [(equal? (car cmdline) "help") #t] [else (eprintf "~a: Unrecognized command: ~a\n\n" @@ -67,24 +82,11 @@ (car cmdline)) #f])]) (eprintf "Usage: raco