Hi,<br><br>I&#39;m using GHC API to dynamically load some module, and evaluate it; and later change the content of the module, and re-evaluate it. But I found unless I delete the object file created by previous compilation, the module seems not reloaded. I have set ghcLink = LinkInMemory as an older post suggested<br>
<br>To illustrate what I&#39;m saying, here is a piece of code (sorry for any naivety in the code, new to Haskell too)<br><br>import System.IO (IOMode(..),hClose,hPutStr,openFile)<br>import Directory (removeFile)<br>import GHC<br>
import GHC.Paths<br>import DynFlags<br>import Unsafe.Coerce<br> <br>src_file = &quot;Target.hs&quot; <br>obj_file = &quot;Target.o&quot;<br> <br>main = do<br>    writeTarget &quot;arg&quot;<br>    func0 &lt;- compileTarget<br>
    putStrLn $ show $ func0 2<br><br>    writeTarget &quot;arg*2&quot;<br>    func1 &lt;- compileTarget<br>    putStrLn $ show $ func1 2<br> <br>writeTarget input = do<br>--    removeFile obj_file `catch` (const $ return ()) -- uncomment this line to have correct results<br>
    h &lt;- openFile src_file WriteMode<br>    hPutStr h &quot;module Target (Target.target) where\n&quot;<br>    hPutStr h &quot;target::Double -&gt; Double\n&quot;<br>    hPutStr h &quot;target arg = \n    &quot;<br>    hPutStr h input<br>
    hClose h<br><br>compileTarget =<br>    defaultErrorHandler defaultDynFlags $ do<br>        func &lt;- runGhc (Just libdir) $ do<br>            -- setup dynflags<br>            dflags &lt;- getSessionDynFlags<br>            setSessionDynFlags dflags { ghcLink = LinkInMemory }<br>
<br>            -- load target module<br>            target &lt;- guessTarget src_file Nothing<br>            setTargets [target]<br>            r &lt;- load LoadAllTargets<br>            case r of<br>                Failed -&gt; error &quot;Compilation failed&quot;<br>
                Succeeded -&gt; do<br>                    m &lt;- findModule (mkModuleName &quot;Target&quot;) Nothing<br>                    -- set context and compile<br>                    setContext [] [m]<br>                    value &lt;- compileExpr (&quot;Target.target&quot;)<br>
                    do<br>                        let value&#39; = (unsafeCoerce value) :: Double -&gt; Double<br>                        return value&#39;<br>        return func<br><br><br>The code basically write to a Haskell source file twice with different content, and hoping to get different results, but unless I uncomment the line with removeFile, the output of 2 runs are the same; using &#39;touch&#39; to touch the source file being written between 2 runs also gives the correct results. So maybe caused by some caching mechanism?<br>
<br>I&#39;m using GHC 6.12.1 in Ubuntu 10.04. I have this workaround of deleting the obj file, but I&#39;m wondering the &quot;correct&quot; way of doing it. Did some search on GHC API, but never got something relevant.<br>
<br>Thanks,<br>Hongmin<br>