[Haskell-cafe] commandline parsing?

Neil Mitchell ndmitchell at gmail.com
Sat Jul 29 09:19:22 EDT 2006


Hi,

Have you seen: System.Console.GetOpt
http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-Console-GetOpt.html

Interestingly Hoogle doesn't seem to index it, but it does exist! (and
in fact Hoogle even uses it...)

Thanks

Neil

On 7/29/06, Marc Weber <marco-oweber at gmx.de> wrote:
> I've  been using pesco_cmdline  for a while now. But I did notice that
> it  doesn't fit my needs.. And it took me quite a while to get to know
> why I was getting strange typeable errors when specifying the wrong
> default  value or reading the wrong type.. (these errors occur at
> runtime thus they don't use haskells  strength)
>
> So I got another crazy  idea. Why not see arguments as tokens and use a
> parser such as parsec?
>
> All you would have to do is creating some kind of syntax tree.
>
> Consider an example application : mmewcde (my mega executable which can
> do everything).
>
> mmewcde edit <file>
> mmewcde mv <file> <file>
> mmewcde mv --target-dir <dest> <folder> <files>>
> mmewcde cp <file> <file>
> mmewcde cp --target-dir <dest> <folder> <files>>
> mmewcde callsox <infile> <options> <outfile>
> Why not something like tar?
> mmewcde tar <x|c|f|v>*  ..?
>
> Of cause I'll have to  write the funtions
> edit :: String -> IO ()
> mv :: String ->  String -> IO ()
> mvDest :: String -> [String] -> IO ()
> ...
> ...
> which have to be called
>
> Now I'd like to do this:
>
>
> optionParser = many $ oneOf [  edit, mv, mvDest, cp, cpDest,  callsox, tar]
> optionParserWithHelp = optionParser <|> printHelp
>
> edit = do
>         string "edit"
>         file <- existingFilename
>         launchEditor file
>
> mv = [..]
> mvDest = do
>         string mv
>         string "--target-dir"
>         td <- existingDirectory
>         files <- many existingFilename
>         map (movefile td) files
>
> [...]
>
> printHelp = do
>         oneOf $ map string ["-h","--help","--usage"]
>         prettyPrint optionParser
>
> main = do
>         args <- getArgs
>         parseAndExecute optionParserWithHelp
>
> prettyPrint might look like this (this will be unncommon ;)
>
> mmewcde --help:
>         many
>                 edit <exitingfile> or
>                 mv  <exitingfile> <file>
>                 ....
>
> Would this be nice? Does this already exist somehow?
>
> perhaps many can even be made nongreedy so that you can specify more
> than one command at once
> mmewcde mv  --target-dir d f1 f2    cp --target-dir d2 f3 f4 ...
>
> Does this make sense?
> I think this would lead to self documenting well mantainable code.
>
> Marc
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list