Hi there,<br>
<br>
I would like to use evaluate arbitrary expressions in the context of a
mixed-language (Ada, Haskell and about twelve lines of C glue)
applications.&nbsp; Is it possible to use dynload from hs-plugins to
load a module that references symbols in the loading program?<br>
<br>
For example, the application contains a Haskell module that looks a bit like this:<br>
<br>
&gt; module TestKeys.NamedObject where<br>
&gt;&nbsp; &nbsp; tt :: Int<br>
&gt;&nbsp; &nbsp; tt = 2<br>
<br>
I want the application to be able to offer the following sort of interaction:<br>
<br>
haskell&gt; tt<br>
2<br>
haskell&gt;<br>
<br>
But what actually happens is this:<br>
<br>
haskell&gt; tt<br>
test_haskell3: /tmp/MDnum15633.o: unknown symbol `TestKeysziNamedObject_tt_closure'<br>
test_haskell3: user error (resolveObjs failed with &lt;&lt;False&gt;&gt;)<br>
<br>
Compiling Haskell code in advance works (i.e. if I create and compile a
module that evalutes tt and link it in, everything runs fine).<br>
<br>
This is how I try to evaluate the expression:<br>
<br>
&gt; evaluate :: String -&gt; IO ()<br>
&gt; evaluate &quot;&quot; = return ()<br>
&gt; evaluate e = do writeFile &quot;temp.hs&quot; fileContents<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; status &lt;- makeWith &quot;LeanderStub.hs&quot; &quot;temp.hs&quot; [&quot;-c&quot;]<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case status of MakeSuccess code path -&gt; loadAndEval path<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MakeFailure
error&nbsp;&nbsp;&nbsp;&nbsp; -&gt; print error<br>
&gt;&nbsp; &nbsp;&nbsp; where fileContents = &quot;module Temp where\n\<br>
&gt;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
\&nbsp;&nbsp; result = &quot; ++ e ++ &quot;\n&quot;<br>
&gt;<br>
&gt; loadAndEval :: FilePath -&gt; IO ()<br>
&gt; loadAndEval path = do mv &lt;- dynload path [] [] &quot;result&quot;<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case mv of<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
LoadFailure msg -&gt; print msg<br>
&gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; LoadSuccess _ v -&gt; putStrLn v<br>
<br>
LeanderStub.hs is a module containing the necessary imports for the expression to evaluate in the right context.<br>
<br>
I was hoping that passing &quot;-c&quot; to makeWith would create an object file
whose missing dependencies would be resolved when it was loaded into an
application which contained them.&nbsp; Is this a dumb
expectation?&nbsp; The alternative -- linking to the entire application
for each expression evaluated -- seems a bit over the top, and I can't
see how state would be maintained.<br>
<br>
I originally used unsafeEval_, but this has the same problem.<br>
<br>
I can't help but think that this must have been done before.&nbsp; Any
advice?&nbsp; If you know Guile, then the equivalent of gh_repl is what
I'm really after.<br>
<br>
cheers,<br>
Fraser.<br>
<br>