Proposal: Add getFullProgName

Simon Hengel sol at typeful.net
Wed Jun 13 10:38:50 CEST 2012


> getProgName is only useful in case you want to print the program name
> to the screen. You cannot actually use it to do anything interesting
> programmatically (like execv:ing the program.) I suggest we add
> getFullProgName which does the sensible thing of returning argv[0].
> Here's an implementation:
> 
> getFullProgName :: IO String
> getFullProgName =
>     alloca $ \ p_argc ->
>     alloca $ \ p_argv -> do
>         getFullProgArgv p_argc p_argv
>         peek p_argv >>= peek >>= peekCString
> 
> foreign import ccall unsafe "getFullProgArgv"
>     getFullProgArgv :: Ptr CInt -> Ptr (Ptr CString) -> IO ()
> 
> Discussion deadline: 2 weeks

This has bothered me for some time, so I really think we should do
something about it.  But I also think that argv[0] is only sane for
compiled programs.  If you run it with `runhaskell` or from `ghci` it
will give you the path to ghc, which is not what I'd expect (from a
users point of view).

In analogous to getProgName I'd suggest to:

 * Return the full path to the script for `runhaskell`
 * Return "<interactive>" when run from GHCi

Or we could make it explicit:

    getFullProgName :: IO ExecutablePath

    data ExecutablePath = Binary FilePath
                        | Script FilePath
                        | Interactive

For reference, there are several packages on Hackage that try to solve
this in some way [1][2][3].

Cheers,
Simon

[1] http://hackage.haskell.org/package/FindBin
[2] http://hackage.haskell.org/package/executable-path
[3] http://hackage.haskell.org/package/system-argv0



More information about the Libraries mailing list