Template Haskell changes to names and package keys

Edward Z. Yang ezyang at mit.edu
Fri May 1 20:08:33 UTC 2015


Hello Dan,

https://ghc.haskell.org/trac/ghc/ticket/9265 I think summarizes
the reason why we shifted to this.  It's also important infrastructural
groundwork for a more sophisticated module system in Haskell.

Edward

Excerpts from Dan Burton's message of 2015-05-01 11:54:05 -0700:
> Can you give (or link to) the rationale for the internal representation
> change? What use cases (or new corner cases for ghc-7.10) justify the added
> complexity here?
> 
> -- Dan Burton
> 
> On Fri, May 1, 2015 at 10:09 AM, Edward Z. Yang <ezyang at mit.edu> wrote:
> 
> > In GHC 7.10, we changed the internal representation of names to
> > be based on package keys (base_XXXXXX) rather than package IDs
> > (base-4.7.0.1), however, we forgot to update the Template Haskell
> > API to track these changes.  This lead to some bugs in TH
> > code which was synthesizing names by using package name and
> > version directly, e.g. https://ghc.haskell.org/trac/ghc/ticket/10279
> >
> > We now propose the following changes to the TH API in order to
> > track these changes:
> >
> >     1. Currently, a TH NameG contains a PkgName, defined as:
> >
> >         newtype PkgName = PkgName String
> >
> >        This is badly misleading, even in the old world order, since
> >        these needed version numbers as well. We propose that this be
> >        renamed to PkgKey:
> >
> >         newtype PkgKey = PkgKey String
> >         mkPackageKey :: String -> PackageKey
> >         mkPackageKey = PkgKey
> >
> >     2. Package keys are somewhat hard to synthesize, so we also
> >        offer an API for querying the package database of the GHC which
> >        is compiling your code for information about packages.  So,
> >        we introduce a new abstract data type:
> >
> >         data Package
> >         packageKey :: Package -> PkgKey
> >
> >        and some functions for getting packages:
> >
> >         searchPackage :: String -- Package name
> >                       -> String -- Version
> >                       -> Q [Package]
> >
> >         reifyPackage :: PkgKey -> Q Package
> >
> >        We could add other functions (e.g., return all packages with a
> >        package name).
> >
> >     3. Commonly, a user wants to get the package key of the current
> >        package.  Following Simon's suggestion, this will be done by
> >        augmenting ModuleInfo:
> >
> >         data ModuleInfo =
> >             ModuleInfo { mi_this_mod :: Module -- new
> >                        , mi_imports :: [Module] }
> >
> >        We'll also add a function for accessing the module package key:
> >
> >         modulePackageKey :: Module -> PkgKey
> >
> >        And a convenience function for accessing the current module:
> >
> >         thisPackageKey :: Q PkgKey
> >         thisPackageKey = fmap (modulePackageKey . mi_this_mod) qReifyModule
> >
> >         thisPackage :: Q Package
> >         thisPackage = reifyPackage =<< thisPackageKey
> >
> > Discussion period: 1 month
> >
> > Thanks,
> > Edward
> >
> > (apologies to cc'd folks, I sent from my wrong email address)
> > _______________________________________________
> > Libraries mailing list
> > Libraries at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> >


More information about the Libraries mailing list