patch applied (ghc): Three improvements to Template Haskell (fixes #3467)

Simon Peyton Jones simonpj at microsoft.com
Thu Sep 10 09:41:35 EDT 2009


Thu Sep 10 05:58:48 PDT 2009  simonpj at microsoft.com
  * Three improvements to Template Haskell (fixes #3467)
  Ignore-this: 40e480334a8cd06d128a845cefd4632a
  
  This patch implements three significant improvements to Template Haskell.
    
  Declaration-level splices with no "$" 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  This change simply allows you to omit the "$(...)" wrapper for 
  declaration-level TH splices.  An expression all by itself is
  not legal, so we now treat it as a TH splice.  Thus you can now
  say
  	data T = T1 | T2
   	deriveMyStuff ''T
  
  where deriveMyStuff :: Name -> Q [Dec]
  This makes a much nicer interface for clients of libraries that use
  TH: no scary $(deriveMyStuff ''T).
  
  Nested top-level splices
  ~~~~~~~~~~~~~~~~~~~~~~~~
  Previously TH would reject this, saying that splices cannot be nested:
  	f x = $(g $(h 'x))
  But there is no reason for this not to work.  First $(h 'x) is run,
  yielding code <blah> that is spliced instead of the $(h 'x). Then (g
  <blah>) is typechecked and run, yielding code that replaces the
  $(g ...) splice.  
  
  So this simply lifts the restriction.
  
  Fix Trac #3467: non-top-level type splices
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
  It appears that when I added the ability to splice types in TH
  programs, I failed to pay attention to non-top-level splices -- that
  is, splices inside quotatation brackets.  
  
  This patch fixes the problem.  I had to modify HsType, so there's a
  knock-on change to Haddock.
  
  Its seems that a lot of lines of code has changed, but almost all the
  new lines are comments!
  
  General tidying up
  ~~~~~~~~~~~~~~~~~~
  As a result of thinking all this out I re-jigged the data type ThStage,
  which had far too many values before.  And I wrote a nice state transition
  diagram to make it all precise; 
     see Note [Template Haskell state diagram] in TcSplice
  
  Lots more refactoring in TcSplice, resulting in significantly less code.
  (A few more lines, but actually less code -- the rest is comments.)
  
  I think the result is significantly cleaner.
  

    M ./compiler/deSugar/DsMeta.hs -44 +54
    M ./compiler/hsSyn/HsTypes.lhs -11 +15
    M ./compiler/parser/Lexer.x -1 +1
    M ./compiler/parser/Parser.y.pp -8 +8
    M ./compiler/parser/RdrHsSyn.lhs -2 +17
    M ./compiler/rename/RnHsSyn.lhs -1 +2
    M ./compiler/rename/RnTypes.lhs +2
    M ./compiler/typecheck/Inst.lhs -1 +1
    M ./compiler/typecheck/TcEnv.lhs -33 +7
    M ./compiler/typecheck/TcExpr.lhs -18 +30
    M ./compiler/typecheck/TcHsType.lhs -3 +9
    M ./compiler/typecheck/TcRnTypes.lhs -17 +35
    M ./compiler/typecheck/TcSimplify.lhs -21
    M ./compiler/typecheck/TcSplice.lhs -191 +276
    M ./docs/users_guide/glasgow_exts.xml -5 +23

View patch online:
http://darcs.haskell.org/ghc/_darcs/patches/20090910125848-1287e-e79364945ef7a629a4e1ce8e08c6e7c88e47e665.gz



More information about the Cvs-ghc mailing list