Understanding DsMeta module

Simon Peyton Jones simonpj at microsoft.com
Thu Dec 18 10:28:10 UTC 2014


|  Thanks. That helps but I still don't understand why the calls are
|  delegated to template-haskell library. Couldn't all of this be done
|  locally?

No. If you have

	f :: Int -> Q Exp

then f is a function that, when run, produces a data structure that is the syntax tree (in the data type of Language.Haskell.TH) of some expression.

Later, in some other module entirely, you may call f, thus

	foo = $(f 5)

Now GHC dynamically links the module that defines f, executes f's code, which returns a syntax tree (in the data type of Language.Haskell.TH).  This is converted to HsSyn and replaces the $(f 5).

So the code for f must be code that, when executed, produces a data structure. The business of DsMeta is to produce such code.


If, once you grok this, you'd like to add a page to the GHC Commentary, to explain it, that would be great. It does take a while to get your head around.

Simon

|  -----Original Message-----
|  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Jan
|  Stolarek
|  Sent: 17 December 2014 19:34
|  To: Richard Eisenberg
|  Cc: ghc-devs at haskell.org
|  Subject: Re: Understanding DsMeta module
|  
|  Thanks. That helps but I still don't understand why the calls are
|  delegated to template-haskell library. Couldn't all of this be done
|  locally?
|  
|  Janek
|  
|  Dnia środa, 17 grudnia 2014, Richard Eisenberg napisał:
|  > On Dec 17, 2014, at 12:29 PM, Jan Stolarek <jan.stolarek at p.lodz.pl>
|  wrote:
|  > > Why not implement repPlainTV like this: ?
|  > >
|  > > repPlainTV :: Core TH.Name -> DsM (Core TH.TyVarBndr) repPlainTV
|  > > (MkC nm) = return $ MkC (TH.PlainTV nm)
|  >
|  > In short, that's ill typed. We have
|  >
|  > > newtype Core a = MkC CoreExpr
|  >
|  > The idea behind this type is that its (phantom) type parameter
|  tracks
|  > the type of the expression stored within. Of course, the thing
|  within
|  > is always just a core expression. TH.PlainTV takes a TH.Name and
|  > produces a TH.TyVarBndr. But, nm is a CoreExpr and MkC is expecting
|  a
|  > CoreExpr, so your suggestion wouldn't type check.
|  >
|  > The higher-level answer is that you're mixing levels. The goal in
|  > DsMeta is
|  > *not* to create the TH AST. It's to create *core expressions* that
|  > create the TH AST.
|  >
|  > Does this help?
|  >
|  > Richard
|  
|  
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at haskell.org
|  http://www.haskell.org/mailman/listinfo/ghc-devs


More information about the ghc-devs mailing list