[Template-haskell] RE: Partial evaluation using TH
Ian Lynagh
igloo at earth.li
Fri Jan 2 17:11:08 EST 2004
On Wed, Dec 31, 2003 at 05:54:08PM -0000, Simon Peyton-Jones wrote:
>
> Nested brackets
> ~~~~~~~~~~
>
> | > evalProg' = [| evalProg |] --same evalProg as before
> |
> | > compileProg :: ExpQ -> ExpQ
> | > compileProg = $( cogen [| evalProg' |] )
>
> I'm very keen that TH should obey the beta rule. That is, given
> x = e
> you can always replace x by e. So in this case you ought to be able to
> write
>
> compileProg = $(cogen [| [| evalProg |] |])
OK, but if I have something like
$(
do e <- [| evalProg' |]
do_something e
)
then I would expect do_something to be given a (VarE n) for some name n.
It doesn't make sense for the compiler to be able to apply the beta rule
in this case.
Are you thinking [| [| 5 |] |] would be equivlent to
return $ return $ LitE $ intL 5 or
return $ QuoteE $ LitE $ intL 5 (data Exp = ... | QuotedE Exp)
?
> ===> Conclusion 1: TH should allow nested brackets (and presumably
> nested $'s).
I think these have to be run innermost first.
There is the meaning of things like
f x = [| [| $x |] |]
g x = $(f 5)
to consider too. I think what makes most sense here depends on which
choice for nested quasi-quotes means above is chosen. For the first I
think g has to be equivalent to
g x = [| [| 5 |] |]
Although neither alternative is unreasonable if we take the second
alternative, I think
g x = [| $x |]
makes more sense (as if I looked at the value of [| [| $x |] |] I would
expect to see (Splice some-name-for-x) in the middle). Maybe if we took
this path then there should be a way to escape $s, giving the choice to
the programmer. Say "f = [| [| \$x |] |]" would give "g x = [| $x |]" but
"f = [| [| $x |] |]" would give "g x = [| [| 5 |] |]" (with an extra \
for each layer of quotes).
> Double encoding
> ~~~~~~~~~~
> You ask for a function
> enc :: Exp t -> Exp (Exp t)
>
> Well that's easy, isn't it?
>
> enc x = return x
>
> I'm not sure if that's what you want. Indeed, you say " So, the thing
> that concerns me is the double encoding. I can't intuitively see the
> need for it..." Maybe you can give the intuition for why you can't see
> the need for it?
>
> I don't think I understand all the issues nearly well enough to comment
> further. Maybe you can chew on it with Ian, who is pretty au fait with
> TH.
I'm not sure I got the need for the double encoding either. Talking it
over in person sounds like a good idea, Duncan.
Thanks
Ian
More information about the template-haskell
mailing list