#5348: Template Haskell quasiquote escapes
---------------------------------+------------------------------------------
    Reporter:  simonpj           |        Owner:              
        Type:  bug               |       Status:  new         
    Priority:  normal            |    Milestone:              
   Component:  Compiler          |      Version:  7.0.3       
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------
 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?
 {{{
   [myparser|blah\1blah|]
 }}}
 That is, what `String` would you expect to be passed to the parser
 `myparser`?  Currently you get exactly the 10-character string
 {{{
 blah\1blah
 }}}
 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.

 However:
  * 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.

 Proposal:
  * Get rid of "`\]`" as an escape sequence
  * Replace "`\]`" as an escape sequence by "`\|]`"
  * Add "`\\`" as an escape sequence

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5348>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to