
velman:
One of the nice things about perl (for example) is that you can put together a script with #!/usr/local/perl (in bash for example) as the first line of a file and run it immediately. I've used perl a lot this way with simple 'throw away' scripts to do special filtering on a file, or some other processing that I want to do one or a few times. occasionally, a script like this will have a more permanant value to me, and I keep it around.
Is there some way to do something similar in with Haskell? I've tried the most obvious (to me) test with Hugs and it doesn't work.
Surely there is a way to do this!
I've been using an interpreter script I wrote which just uses ghc to create an executable in /tmp, and then runs it. It compares modification times, so if your script hasn't changed, it doesn't run ghc and there isn't much overhead. Thus it is faster than runghc in the common case. The thing is, it doesn't work very well. If your script depends on a module, and that module changes, then it doesn't know to recompile the script. I tried to get around this using "ghc --make", but unfortunately this isn't as fast as it could be in the common case (I think it could be as fast as "ghc -M", but isn't), and is therefore unsuitable for our application. I tried using "ghc -M", "make -q" and then "ghc --make", but it appears that "ghc -M" outputs dependencies on .hi files whose modification times aren't always updated by "ghc --make" when they are rebuilt, causing a stuck "out-of-date" condition which breaks the dependency analysis. Anyway, my interpreter script is here, but at least in part because I wasn't able to get around the above problems, it isn't very good: http://a5.repetae.net/~frederik/hs-interp e.g. $ cat test #!/usr/bin/env hs-interp main = do putStrLn "hello world" $ ./test hello world -- Frederik