Template Haskell changes to names and package keys
Edward Kmett
ekmett at gmail.com
Sat May 2 17:25:07 UTC 2015
I'm fully on board with cleaning up the story around package keys, so +1 on
the mission, but I have very few preferences on the particulars.
-Edward
On Fri, May 1, 2015 at 1:06 PM, Edward Z. Yang <ezyang at cs.stanford.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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20150502/12534f11/attachment.html>
More information about the Libraries
mailing list