With some more context:
foo = ($expr "1 + 2")
v.
bar = [$expr| 1 + 2]
In the first example (assuming TH is enabled), $expr is a splice, which happens
at compile time. 'expr' is some value of type Q Exp (the AST for a Haskell
expression, in the quotation monad). The application of $expr to the value "1
+ 2" happens at runtime (assuming $expr splices a value of type String -> a,
otherwise its a compile time error).
In the second example, expr is a value of type QuasiQuoter, which contains an
element quoteExpr, a function of type String -> Q Exp, which is applied at
compile time to the contents of the quasiquotation (" 1 + 2"), and the result
spliced in. The value of 'foo' and 'bar' could work out to be exactly the
same, depending on the implementation of expr in each instance. But the 'work'
of expr in the first instance happens when the value of foo is demanded,
whereas in the second case, it happens at compile time.
Of course, you could also have:
foo = $(expr "1 + 2")
In this case expr is a function of type String -> Q Exp, which is applied to
its argument "1 + 2" at compile time. It is very similar to the QQ example.
One advantage to qq is that you can do:
foo s = [$expr|
int main(int argc, char** argv) {
printf("hello $s!\n");
}
|]
assuming your expression parser supports anti-quotation. Also you can in
theory put qq's in patterns:
foo y [$expr|printf($_)|] = [$expr|printf($y)|]
although take this example with a grain of salt (I've not played with this
aspect of quasiquotation). Note also that antiquotation syntax is completely
up to the QuasiQuoter (the $s, $_, could just as easily be @{s} or ***_***, or
something else, depending on the implementation of expr).
----- Original Message ----
From: Andrew Coppin <[email protected]>
To: [email protected]
Sent: Monday, March 30, 2009 5:26:28 PM
Subject: [Haskell-cafe] [Probably a dumb question] Quasiquoting
Can somebody explain to me how
[$expr| 1 + 2 |]
is different from
($expr "1 + 2")
Other than a superficially different type signature, I'm not seeing what the
fundamental difference is...
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe