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 的 monad 的函数中GhcMonad
。我很清楚使用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)