Corentin Dupont | 22 Feb 18:44 2013
Picon

Type checking the content of a string

Hi all,
I have a program able to read another program as a string, and interpret it (using Hint).
I'd like to make unit tests, so I have a file "Test.hs" containing a serie of test programs as strings.
However, how could I be sure that these test program are syntactically valid, at compile time?
Those programs should have the type "RuleFunc".

I tried some TH:
printProg :: Q Exp -> String
printProg p = unsafePerformIO $ do
   expr <- runQ p
   return $ pprint expr

myTest = printProg [| <my test program> :: RuleFunc |]


But it's not very satisfatory yet. When pretty printing TH changes the program quite a bit and my interpreter cannot compile it due to scoping problems.
I'd like to have my test program copied back as is. Is it possible? Any other solutions?

Thanks a lot!
Corentin

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
adam vogt | 22 Feb 19:12 2013
Picon

Re: Type checking the content of a string

On Fri, Feb 22, 2013 at 12:44 PM, Corentin Dupont
<corentin.dupont <at> gmail.com> wrote:
> Hi all,
> I have a program able to read another program as a string, and interpret it
> (using Hint).
> I'd like to make unit tests, so I have a file "Test.hs" containing a serie
> of test programs as strings.
> However, how could I be sure that these test program are syntactically
> valid, at compile time?

Hi Corentin,

You could write the test programs like:

test1 :: String
test1 = [qq| x+1 == 3 |]

Where qq is a QuasiQuoter you have to define. It could try to parse
the string with http://hackage.haskell.org/package/haskell-src-exts,
and if that succeeds, returns the original string.

--
Adam
Corentin Dupont | 22 Feb 19:43 2013
Picon

Re: Type checking the content of a string

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.



On Fri, Feb 22, 2013 at 7:12 PM, adam vogt <vogt.adam <at> gmail.com> wrote:
On Fri, Feb 22, 2013 at 12:44 PM, Corentin Dupont
<corentin.dupont <at> gmail.com> wrote:
> Hi all,
> I have a program able to read another program as a string, and interpret it
> (using Hint).
> I'd like to make unit tests, so I have a file "Test.hs" containing a serie
> of test programs as strings.
> However, how could I be sure that these test program are syntactically
> valid, at compile time?

Hi Corentin,

You could write the test programs like:

test1 :: String
test1 = [qq| x+1 == 3 |]

Where qq is a QuasiQuoter you have to define. It could try to parse
the string with http://hackage.haskell.org/package/haskell-src-exts,
and if that succeeds, returns the original string.

--
Adam

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Francesco Mazzoli | 22 Feb 20:30 2013
Picon

Re: Type checking the content of a string

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
Corentin Dupont | 22 Feb 23:51 2013
Picon

Re: Type checking the content of a string

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 <at> 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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Corentin Dupont | 23 Feb 00:03 2013
Picon

Re: Type checking the content of a string

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 durring 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 <at> 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 <at> 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


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Corentin Dupont | 23 Feb 18:55 2013
Picon

Re: Type checking the content of a string

Up on that, anybody already tried to load an haskell interpreter in a QuasiQuoter?

On Sat, Feb 23, 2013 at 12:03 AM, Corentin Dupont <corentin.dupont <at> 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 durring 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 <at> 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 <at> 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



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe <at> haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Brent Yorgey | 23 Feb 21:53 2013

Re: Type checking the content of a string

On Fri, Feb 22, 2013 at 06:44:06PM +0100, Corentin Dupont wrote:
> Hi all,
> I have a program able to read another program as a string, and interpret it
> (using Hint).
> I'd like to make unit tests, so I have a file "Test.hs" containing a serie
> of test programs as strings.
> However, how could I be sure that these test program are syntactically
> valid, at compile time?

If you just want to check whether a program is syntactically valid,
you can use the haskell-src-exts package to parse it.  If you also
want to do some type checking you can try the haskell-type-exts
package.

-Brent

Gmane