
On Sun, Aug 17, 2008 at 8:45 PM, Paul Jarc
I have a Haskell script called "notify", without a .hs extension, which causes some problems. (I'm using ghc 6.8.3.)
First attempt: runhaskell notify Without the .hs extension, ghc doesn't know it's a Haskell script, and so I get "Could not find module `notify'". Maybe runhaskell should automatically add "-x hs" to the ghc command?
Second attempt: runhaskell -x hs notify This get me "Not in scope: `main'". runhaskell is invoking ghc with these arguments: -ignore-dot-ghci -x -e ':set prog "hs"' -e ':main ["notify"]' hs So it looks like runhaskell it treating "-x" as an argument to be relayed to ghc, "hs" as the name of the script, and "notify" as an argument to the script. I guess I need to use "--" to make it clear where the ghc arguments end and where the script and its arguments begin.
Third attempt: runhaskell -- -x hs -- notify This gets me "Not in scope: `main'" again. runhaskell is invoking ghc with these arguments: -ignore-dot-ghci -x -e ':set prog "hs"' -e ':main ["--","notify"]' hs This looks like a bug in the "--" handling, unless I'm misinterpreting the usage message I get from running plain "runhaskell".
Fourth attempt: ghc -ignore-dot-ghci -e ':set prog "notify"' \ -e ':main []' -x hs notify This works, but passing arguments becomes rather cumbersome. If there's a way to get runhaskell to pass "-x hs" in the right place, that would be much better.
A somewhat related issue: I'd like to avoid hard-coding the path to runhaskell or ghc in the #! line. Instead, I'd like to use #!/bin/sh, and have the shell find runhaskell or ghc in $PATH.
I'll let someone more knowledgeable address the other issues, but as for the argument to #!, I believe you could/should use "#!/usr/bin/env runhaskell".
This means the first few lines of the script would have to be executed by sh, but ignored by ghc. Most scripting langauges have some way of doing this, although it's often by accident. The best way I've seen is in Guile, where "#!" starts a multi-line comment, and "!#" ends it. For Haskell, this is the best I could come up with:
#!/bin/sh {- > /dev/null 2>&1 exec ghc -ignore-dot-ghci \ -e ":set prog \"$0\"" \ -e ':main []' -x hs "$0" -}
But this depends on "{-" not existing as an executable command, or at least not doing anything harmful when invoked like this. I'd like to avoid depending on anything like that. Does anyone have any better ideas?
paul _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users