Skip to content
  • Simon Peyton Jones's avatar
    Three improvements to Template Haskell (fixes #3467) · 1e436f2b
    Simon Peyton Jones authored
    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.
    1e436f2b