Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Haskell-cafe] commandline parsing?

0 views
Skip to first unread message

Marc Weber

unread,
Jul 29, 2006, 8:53:00 AM7/29/06
to haskel...@haskell.org
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
Haskel...@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Neil Mitchell

unread,
Jul 29, 2006, 9:19:39 AM7/29/06
to Marc Weber, haskel...@haskell.org
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-...@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 ()
> ...

> ...

0 new messages