GHC API では、呼び出しの前に何らかの初期化が行われる必要があります。具体的には、parseStaticFlags
一度だけ呼び出すことができます。
runGhc :: MaybeFilePath :: Ghc a -> IO a
いくつかの GHC API メソッドを実行するために複数回呼び出すことができる関数があります。ただし、その初期化の一部は、その関数が最初に呼び出されたときにのみ発生する必要があります。
Yi
次のようなグローバル変数を作成できることをソースから覚えているようです
ghcInitialised :: MVar (Bool,[String])
ghcInitialised = unsafePerformIO $ newMVar (False,[])
そのため、呼び出すモナド アクションでrunGhc
使用できます。
(init,flags) <- readMVar ghcInitialised
when (not init) $ do
...
(_,_,staticFlagWarnings) <- parseStaticFlags ...
...
putMVar ghcInitialised (True,staticFlagWarnings)
しかし、それがどのように行われたかを正確に思い出すことはできません。このコードは、runMonad
a をラップするモナドの関数にありGhcMonad
ます。using が純粋でも機能的でもないことは十分承知していunsafePerformIO
ますが、(当時は) これが実用的な結果を達成するための最良の方法でした。
[編集: 実用的なソリューション:
{-# NOINLINE ghcInitialised #-}
ghcInitialised :: MVar (Bool,[String])
ghcInitialised = unsafePerformIO $ newMVar (False,[])
そのため、呼び出すモナド アクションでrunGhc
使用できます。
(init,flags) <- takeMVar ghcInitialised
when (not init) $ do
...
(_,_,staticFlagWarnings) <- parseStaticFlags ...
...
putMVar ghcInitialised (True,staticFlagWarnings)