;; build a map from /etc/mime.types ;; ((ext . type) ...) (define (file->string-list file . opts) (apply call-with-input-file file (pa$ port->list read-line) opts)) (define (make-mime-mapper) (let ((mime-map ()) (rawtext (file->string-list "/etc/mime.types"))) (dolist (line rawtext) (rxmatch-case line (#/^#/ (#f) ;;(print "skipped comment") 'ok) (#/^$/ (#f) ;;(print "empty line") 'ok) (#/([^\s]*?)\s+(.+)$/ (#f type exts) (format #t "match/ext: ~s ~s\n" type exts) (dolist (ext (string-split exts " ")) (set! mime-map (cons (cons (string->symbol ext) (string->symbol type)) mime-map)))) (#/(.*)/ (type) ;;(print "match/noext: " type) 'ok) (else (print "*** No comprendo: " line)))) ;; show result (print mime-map) ;; return the mapper fn (lambda (ext) (let1 rec (assoc ext mime-map) (and rec (cdr rec)))))) (define (main args) (let1 mapper (make-mime-mapper) (print (mapper 'html)) (print (mapper 'plok))))