RE: Understanding DsMeta module

2014-12-18 Thread Simon Peyton Jones
|  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-boun...@haskell.org] On Behalf Of Jan
|  Stolarek
|  Sent: 17 December 2014 19:34
|  To: Richard Eisenberg
|  Cc: ghc-devs@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.stola...@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@haskell.org
|  http://www.haskell.org/mailman/listinfo/ghc-devs
___
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs


Re: Understanding DsMeta module

2014-12-17 Thread Richard Eisenberg

On Dec 17, 2014, at 12:29 PM, Jan Stolarek jan.stola...@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@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs


Re: Understanding DsMeta module

2014-12-17 Thread Jan Stolarek
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.stola...@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@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs


Re: Understanding DsMeta module

2014-12-17 Thread Richard Eisenberg
But you need an expression that, say, produces a PlainTV. Where are you going 
to find an expression that does this without using the template-haskell library?

On Dec 17, 2014, at 2:33 PM, Jan Stolarek jan.stola...@p.lodz.pl wrote:

 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.stola...@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@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs