Template Haskell changes to names and package keys

Richard Eisenberg eir at cis.upenn.edu
Mon May 4 11:54:46 UTC 2015


Thanks for spearheading this update.

I'm +1 on #1, in particular because I don't think TH should try too hard to have a stable API.

I'm +0.5 on #2, because the interface as designed below is too weak. I'm +1 for a stronger interface. For example:

packageVersionString :: Package -> String   -- maybe use a newtype here? or the proper Cabal datatype?
packageName          :: Package -> String   -- use the old PkgName here? or is that confusing?

packageDependencies :: Package -> Q [Package]
  -- could be very useful in printing debugging information. Then, if you're writing a library that
  -- is sensitive to dependency versions, you can print this info out when you panic

I'm -1 on #3 if it will break code. You can already get current package information through the `qLocation` function.

One need I've had a few times is to be able to get a version number for the current package, just for UI nicety. It would be great if this change could support such an operation (like my packageVersionString, above).

Thanks!
Richard

PS: I wonder if this proposal and debate wouldn't be easier to follow in wiki format. That way, the design could evolve over time...

On May 1, 2015, at 1:09 PM, 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