Finally, I solved the problem using typeOf instead of interpret:
cr :: QuasiQuoter
cr = QuasiQuoter { quoteExp = quoteRuleFunc}
quoteRuleFunc :: String -> Q TH.Exp
quoteRuleFunc s = do
res <- runIO $ runInterpreter $ do
setImports ["Prelude", "Language.Nomyx.Expression"]
typeOf s
case res of
Right "RuleFunc" -> [| s |]
Right _ -> fail $ "Rule doesn't typecheck"
Left e -> fail $ show e
I don't know really why, but now it's working very well!
Hi Corentin,
I've never used TH, but from what I understand, trying to combine hint and TH would be redundant (even if it worked): whatever String you can evaluate using hint, you can evaluate it directly in TH. Is this not the case?
Cheers,
Daniel
On Feb 23, 2013, at 6:53 PM, Corentin Dupont wrote:
> Hi Daniel,
> Did you already tried to use Hint in a QuasiQuote? This would come handy to check at compile time the validity of some strings...
> However I have the error hereunder.
> The duplicate symbol found in the object file is in fact the first symbol in this file. So I guess GHCi tries to load it twice...
> Best,
> Corentin
>
>
> On Sat, Feb 23, 2013 at 12:03 AM, Corentin Dupont <corentin.dupont@gmail.com> wrote:
> I'm trying to load my interpreter in the Q monad:
>
> cr :: QuasiQuoter
> cr = QuasiQuoter { quoteExp = quoteRuleFunc}
>
> quoteRuleFunc :: String -> Q TH.Exp
> quoteRuleFunc s = do
> res <- runIO $ runInterpreter $ do
> setImports ["Prelude", "Language.Nomyx.Rule", "Language.Nomyx.Expression", "Language.Nomyx.Test",
> "Language.Nomyx.Examples", "GHC.Base", "Data.Maybe"]
> interpret s (as :: RuleFunc)
> case res of
> Right _ -> [| s |]
> Left e -> fail $ show e
>
>
> However, I always obtain an error during compilation:
>
> ...
> Loading package XXX ... linking ... done.
>
>
> GHCi runtime linker: fatal error: I found a duplicate definition for symbol
> __stginit_ghczm7zi4zi1_DsMeta
> whilst processing object file
> /usr/lib/ghc/ghc-7.4.1/libHSghc-7.4.1.a
> This could be caused by:
> * Loading two different object files which export the same symbol
> * Specifying the same object file twice on the GHCi command line
> * An incorrect `package.conf' entry, causing some object to be
> loaded twice.
> GHCi cannot safely continue in this situation. Exiting now. Sorry.
>
>
> I vaguely understand that the interpreted modules are conflicting with the compiled ones...
>
>
>
> On Fri, Feb 22, 2013 at 11:51 PM, Corentin Dupont <corentin.dupont@gmail.com> wrote:
> Great! That seems very powerful. So you can do what you want during compilation, readin files, send data over the network?
> Other question, in my example how can I halt the compilation if a test program is wrong?
>
>
> On Fri, Feb 22, 2013 at 8:30 PM, Francesco Mazzoli <f@mazzo.li> wrote:
> At Fri, 22 Feb 2013 19:43:51 +0100,
> Corentin Dupont wrote:
> > Hi Adam,
> > that looks interresting. I'm totally new to TH and QuasiQuotes, though.
> > Can I run IO in a QuasiQuoter? I can run my own interpreter.
>
> Yes, you can:
> <http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH.html#v:runIO>.
>
> Francesco
>
>
>