Template Haskell quasiquote escapes
|Reported by:||simonpj||Owned by:|
|Keywords:||Cc:||gale@…, mainland@…, kfisher@…, michael@…, jonas.duregard@…, gershomb@…, haskell@…|
|Type of failure:||None/Unknown||Test Case:|
|Related Tickets:||Differential Revisions:|
This ticket arises from a brief email thread http://www.haskell.org/pipermail/glasgow-haskell-users/2011-June/020550.html and http://www.haskell.org/pipermail/glasgow-haskell-users/2011-July/020564.html
In a Template Haskell quasiquote, what would you expect this to do?
That is, what String would you expect to be passed to the parser myparser? Currently you get exactly the 10-character string
The backslash is passed on literally. The principle is to do as little meddling as possible, leaving it up to myparser to do what it wants. However, backslash does initiate some limited escape behaviour
[myparser|blah\|blah|] -- gives "blah|blah" (9 chars) [myparser|blah\|]blah|] -- gives "blah|]blah" (10 chars) [myparser|blah\]blah|] -- gives "blah]blah" (9 chars)
The motivation here is that you might want the sequence "|]" in your quoted string, and to do so you have to escape it.
- Currently "\]" is an escape sequence, but it does not need to be.
- Currently "\|" is an escape sequence, whereas it could be "\|]". Then [myparser|blah\|blah|] would yield the (10-char) string blah\|blah.
- There is no way to have a quote that ends in a backslash, thus [myparser|\blahblah\|]. This could be fixed by adding "\\" as an escape sequence for backslash.
An alterntive would be to support no escapes at all, but instead ask myparser itself to determine where the quotation ended. Instead of String -> Q Exp the parser would have type String -> Q (String,Exp). This seems to me to be a bridge too far. Better to get GHC to determine where the quote ends.
- Get rid of "\]" as an escape sequence
- Replace "\]" as an escape sequence by "\|]"
- Add "\\" as an escape sequence