[Haskell-cafe] using ghc as a library
Daniel Gorín
dgorin at dc.uba.ar
Sun Oct 26 12:36:04 EDT 2008
On Oct 25, 2008, at 8:39 PM, Anatoly Yakovenko wrote:
> so I am trying to figure out how to use ghc as a library. following
> this example, http://www.haskell.org/haskellwiki/GHC/As_a_library, i
> can load a module and examine its symbols:
> [...]
>
> given Test.hs:
>
> module Test where
>
> hello = "hello"
> world = "world"
> one = 1
> two = 2
>
> i get this output:
>
> $ ./Main ./Test.hs
> "[]"
> "[Test.hello, Test.one, Test.two, Test.world]"
>
> which is what i expect. My question is, how do manipulate the symbols
> exported by Test? Is there a way to test the types? lets say i
> wanted to sum all the numbers and concatenate all the strings in
> Test.hs, how would i do that?
Hi, Anatoly
Sorry for don't answering your question in the first place, but for
this kind of tasks I believe you might be better off using some
lightweight wrapper of the GHC Api. For instance, using http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hint
you write:
import Language.Haskell.Interpreter.GHC
import Control.Monad.Trans ( liftIO )
import Control.Monad ( filterM )
test_module = "Test"
main :: IO ()
main = do s <- newSession
withSession s $ do
loadModules [test_module] -- loads Test.hs...
setTopLevelModules [test_module] -- ...and puts it in
scope
setImports ["Prelude"] -- put the Prelude in
scope too
--
exports <- getModuleExports "Test" -- get Test's symbols
let ids = [f | Fun f <- exports]
--
strings <- filterM (hasType "[Char]") ids
conc <- concat `fmap` mapM (\e -> interpret e infer)
strings
liftIO $ putStrLn conc
--
ns <- filterM (hasType "Integer") ids
sum_ns <- sum `fmap` mapM (\e -> interpret e (as ::
Integer)) ns
liftIO $ putStrLn (show sum_ns)
hasType :: String -> Id -> Interpreter Bool
hasType t e = do type_of_e <- typeOf e
return (type_of_e == t)
$ ./Main
helloworld
3
The version in hackage of hint works only with GHC 6.6.x and 6.8.x,
mind you, but a new version is coming soon....
Good luck,
Daniel
More information about the Haskell-Cafe
mailing list