Sounds like a good pan to me. Note that we would still need a small GHC-version-specific shim, somewhere, to define the Q monad, which does occasionally change. We could push it into the GHC API.
Having three Haskell ASTs has always been a pain---it would be nice to finally fix this situation. Using your proposal, we could implement a fully compatible template-haskell library on top of the GHC AST and the "internal" Q monad. We could also implement an analogous package that was based on haskell-src-exts instead; in fact, it would be nice if the latter became the "standard" Template Haskell implementation, as it would also help us avoid hacks like haskell-src-meta. Geoff On 11/12/15 9:14 AM, Richard Eisenberg wrote: > Yes, that's right. But with a compatibility shim, no longer tied into GHC, > that could provide stability and/or a simpler interface. This compatibility > shim would likely be called template-haskell. (I retract the idea of > deprecating the package. But we could democratize its maintenance rather > easily after this change.) > > Richard > > On Nov 12, 2015, at 12:12 PM, Geoffrey Mainland <mainl...@apeiron.net> wrote: > >> Hi Richard, >> >> Please correct me if I misunderstand, but in summary, you propose to >> change Template Haskell so that GHC's internal AST is produced directly, >> instead of the current route where there is an intermediate TH AST? >> >> Geoff >> >> On 11/11/2015 11:26 AM, Richard Eisenberg wrote: >>> Hi devs, >>> >>> There's a bunch of open tickets around Template Haskell. A great many of >>> them are attempts to make TH more like what's already in GHC. Of course, >>> when someone improves GHC, then TH also has to be updated. But this doesn't >>> always happen, leading to several of these tickets. >>> >>> I believe I have a solution to the problem: just eliminate Template Haskell >>> and provide direct access to GHC's internal structures. The idea (still >>> very sketchy; hence pre-proposal) is like this (numbered for easy >>> reference, but no order is implied): >>> >>> 1. TH quotes would remain. DsMeta would desugar quotes into Core code that >>> produces HsExprs. For example, [| 1 |] would have type (Q (LHsExpr Name)). >>> (Or perhaps (Q (LHsExpr RdrName)) if that works out better for clients.) >>> >>> 2. TH splices would remain, working much as they do now. The expression >>> inside, say, an expression splice would have type (Q exp) where we can >>> satisfy the constraint (SpliceExpr exp). There would be instances for >>> (SpliceExpr (LHsExpr Name)) and (SpliceExpr (LHsExpr RdrName)) as well as >>> the non-located variants. Generalizing the type of expressions here allows >>> users not to worry about un-renaming when roundtripping between quotes and >>> splices. >>> >>> 3. Reification would remain, using an Info structure much like we have now. >>> Would we expose the real GHC TyCons as the result of reification? Or is it >>> better to give the users HsDecls? This would need to be fleshed out. >>> >>> 4. Lifting would remain, doing the obvious thing. >>> >>> 5. The template-haskell package could even remain, as a >>> backward-compatibility shim. It would declare gobs of pattern synonyms and >>> type synonyms to wrap the new underlying interface. This re-imagined >>> template-haskell package would not need to be a boot library, and could be >>> upgraded separately from GHC. We could even maintain multiple versions of >>> the library so that TH clients wouldn't have to change their code when GHC >>> upgrades. Perhaps someday we could think about deprecating, if that's the >>> way the wind blows. >>> >>> So, the end result is a completely re-engineered TH, but I believe we could >>> keep full backward compatibility. (I have not considered Typed TH in any >>> depth yet. But my hope is that it's not too different from the above.) And, >>> we're left with a significantly lower maintenance burden, especially if we >>> eliminate template-haskell someday. >>> >>> And, tantalizingly, the flexibility in splices might allow us to splice in >>> *Core* code someday. Perhaps we could also reify Core code. Then clients >>> could write their own custom, domain-aware optimizations. Like RULES on >>> steroids. But that's all for the next phase. (Giving due credit, this last >>> bit is inspired by work David Christiansen is doing in Idris.) >>> >>> What's wrong with this idea? I feel like *something* has to be more >>> complicated than I've made it seem! >>> >>> Richard _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs