adam vogt wrote:

> TH quotes limited as you've noticed. One way to generate similar code
> is to note that:
> 
> do
>   let x = y
>   z
> 
> is the same as let x = y in do z. You can generate the latter with
> something like the following file, but the `a' isn't in scope for the
> second argument to makeLetStatement. The uglier $(dyn "a") works,
> though I suppose it's more verbose than manually in-lining the
> variable a.
> 
> {-# LANGUAGE TemplateHaskell #-}
> import Language.Haskell.TH
> 
> main = $(let
> 
>     makeLetStatement :: String -> ExpQ -> ExpQ
>     makeLetStatement s rest = letE [ valD (varP (mkName s))
>                     (normalB $ stringE s) []]
>                     rest
> 
>     in makeLetStatement "a" [| print $(dyn "a") |] )

Thanks Adam.
Unfortunately, this solution is not satisfying because the goal is to put 
only one mention to "a" in the "main" part, putting all the repetitive code 
and ExpQ's in a separate module. Tonight, I've tried hard one more time 
without more success.
Maybe I have to stick to non-let expressions in the "main" part of a script, 
when it comes to TH. It should nevertheless allow me to call functions, make 
tests, etc.

Thanks,

TP


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to