ghc
パッケージはGHCのフロントエンドの大部分をユーザに露出し、それを活用するプログラムを書けるようにする。実際、このライブラリはGHC内部のフロントエンドコンパイルドライバが使っているものと同じであるので、ソースコードをプログラム的にコンパイルしたり中身を読んだりするツールを書くことを可能にする。このような機能はIDEやリファクタリングツールの類を書くのに便利である。単純な例として、ここに示すのは、GHCがデフォルトで行うのとちょうど同じようにモジュールをコンパイルするプログラムである。
import GHC import GHC.Paths ( libdir ) import DynFlags ( defaultLogAction ) main = defaultErrorHandler defaultLogAction $ do runGhc (Just libdir) $ do dflags <- getSessionDynFlags setSessionDynFlags dflags target <- guessTarget "test_main.hs" Nothing setTargets [target] load LoadAllTargets
runGhc
の引数はやや注意を要する。GHCは自分のライブラリ群を見付ける必要があるので、この引数はghc --print-libdir
で出力されるディレクトリでなければならない。ただし、このプログラムをコンパイルするのに使っているのと同じバージョンのGHCを使う必要がある。したがって上では、これを供給するghc-paths
パッケージを使っている。
これをコンパイルすると次のようになる。
$ cat test_main.hs main = putStrLn "hi" $ ghc -package ghc simple_ghc_api.hs [1 of 1] Compiling Main ( simple_ghc_api.hs, simple_ghc_api.o ) Linking simple_ghc_api ... $ ./simple_ghc_api $ ./test_main hi $
このAPIを使うことについてのさらなる情報および、サンプルとリファレンスについては、Haskell.org wikiのこのページを見てほしい。