Template Haskell changes to names and package keys
Edward Z. Yang
ezyang at mit.edu
Fri May 1 17:09:20 UTC 2015
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)
More information about the Libraries
mailing list