【发布时间】:2011-09-23 05:46:33
【问题描述】:
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)
但是,我不记得它是如何完成的。这段代码在包裹GhcMonad 的monad 的runMonad 函数中。我很清楚使用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)
【问题讨论】: