
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