<div dir="ltr">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.<div><br></div><div>-Edward</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 1, 2015 at 1:06 PM, Edward Z. Yang <span dir="ltr"><<a href="mailto:ezyang@cs.stanford.edu" target="_blank">ezyang@cs.stanford.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In GHC 7.10, we changed the internal representation of names to<br>
be based on package keys (base_XXXXXX) rather than package IDs<br>
(base-4.7.0.1), however, we forgot to update the Template Haskell<br>
API to track these changes. This lead to some bugs in TH<br>
code which was synthesizing names by using package name and<br>
version directly, e.g. <a href="https://ghc.haskell.org/trac/ghc/ticket/10279" target="_blank">https://ghc.haskell.org/trac/ghc/ticket/10279</a><br>
<br>
We now propose the following changes to the TH API in order to<br>
track these changes:<br>
<br>
1. Currently, a TH NameG contains a PkgName, defined as:<br>
<br>
newtype PkgName = PkgName String<br>
<br>
This is badly misleading, even in the old world order, since<br>
these needed version numbers as well. We propose that this be<br>
renamed to PkgKey:<br>
<br>
newtype PkgKey = PkgKey String<br>
mkPackageKey :: String -> PackageKey<br>
mkPackageKey = PkgKey<br>
<br>
2. Package keys are somewhat hard to synthesize, so we also<br>
offer an API for querying the package database of the GHC which<br>
is compiling your code for information about packages. So,<br>
we introduce a new abstract data type:<br>
<br>
data Package<br>
packageKey :: Package -> PkgKey<br>
<br>
and some functions for getting packages:<br>
<br>
searchPackage :: String -- Package name<br>
-> String -- Version<br>
-> Q [Package]<br>
<br>
reifyPackage :: PkgKey -> Q Package<br>
<br>
We could add other functions (e.g., return all packages with a<br>
package name).<br>
<br>
3. Commonly, a user wants to get the package key of the current<br>
package. Following Simon's suggestion, this will be done by<br>
augmenting ModuleInfo:<br>
<br>
data ModuleInfo =<br>
ModuleInfo { mi_this_mod :: Module -- new<br>
, mi_imports :: [Module] }<br>
<br>
We'll also add a function for accessing the module package key:<br>
<br>
modulePackageKey :: Module -> PkgKey<br>
<br>
And a convenience function for accessing the current module:<br>
<br>
thisPackageKey :: Q PkgKey<br>
thisPackageKey = fmap (modulePackageKey . mi_this_mod) qReifyModule<br>
<br>
thisPackage :: Q Package<br>
thisPackage = reifyPackage =<< thisPackageKey<br>
<br>
Discussion period: 1 month<br>
<br>
Thanks,<br>
Edward<br>
<br>
</blockquote></div><br></div>