So, my premise is that only developers use command lines anymore. And after years of corporate enslavement, it's nice to run off to the woods, make a log cabin and all your tools yourself.
Therefore the best way to parse arguments in Scheme is:
(define debug #f) (define outfile #f) (define infiles '()) (define (main argv) (set! debug (if (member "--debug" argv) #t #f)) ;; boolean (set! outfile (if (member "--out" argv) (cadr (member "--out" argv)) #f)) ;; key-value (set! infiles (if (member "--" argv) (cdr (member "--" argv)) #f)) ;; all after -- (unless outfile (error 'main "No outfile given")) ;; maybe show a whole usage & exit )
This has some disadvantages. It's only discoverable by reading docs or even code, and you have to write the docs yourself. If you want short args, you have to duplicate lines and maybe set the arg twice.
But it's trivial to set up, you can't really get it wrong, and the amount of effort is appropriate to a developer interface.
(You might complain I'm using globals, you can just change those to
For the young over-engineering crowd, there are a variety of arg parsing libraries. And I'm too lazy to demonstrate each of them. But in the set of generates usage, is easy to use, and you'll be able to remember how it works in a year, they all get maybe 1, and need to be 3.