[[project @ 2002-03-14 15:26:53 by simonpj] simonpj**20020314152654 Lots of stuff about external and internal names ] { addfile ./ghc/docs/comm/the-beast/names.html hunk ./ghc/docs/comm/index.html 59 +
  • The truth about names: Names and OccNamesd hunk ./ghc/docs/comm/the-beast/names.html 1 + + + + + The GHC Commentary - The truth about names: OccNames, and Names + + + +

    The GHC Commentary - The truth about names: OccNames, and Names

    +

    + + +Every entity (type constructor, class, identifier, type variable) has +a Name. The Name type is pervasive in GHC, +and is defined in basicTypes/Name.lhs. Here is what a Name looks like, +though it is private to the Name module. +

    +  data Name = Name {
    +		n_sort :: NameSort,	-- What sort of name it is
    +		n_occ  :: !OccName,	-- Its occurrence name
    +		n_uniq :: Unique,       -- Its identity
    +		n_loc  :: !SrcLoc	-- Definition site
    +	    }
    +
    + + + +

    The NameSort of a Name

    + +There are three flavours of Name: +
    +  data NameSort
    +    = External Module
    +    | Internal
    +    | System
    +
    + + + + +

    Occurrence names: OccName

    + +An OccName is more-or-less just a string, like "foo" or "Tree", +giving the (unqualified) name of an entity. + +Well, not quite just a string, because in Haskell a name like "C" could mean a type +constructor or data constructor, depending on context. So GHC defines a type +OccName (defined in basicTypes/OccName.lhs) that is a pair of +a FastString and a NameSpace indicating which name space the +name is drawn from: +
    +    data OccName = OccName NameSpace EncodedFS
    +
    +The EncodedFS is a synonym for FastString indicating that the +string is Z-encoded. (Details in OccName.lhs.) Z-encoding encodes +funny characters like '%' and '$' into alphabetic characters, like "zp" and "zd", +so that they can be used in object-file symbol tables without confusing linkers +and suchlike. + +

    +The name spaces are: +

    + + +Last modified: Tue Nov 13 14:11:35 EST 2001 + + + + + hunk ./ghc/docs/comm/the-beast/renamer.html 19 -That is, it converts all the RdrNames to Names. +That is, it converts all the RdrNames to Names. hunk ./ghc/docs/comm/the-beast/renamer.html 21 -

    OccNames, RdrNames, and Names

    +

    RdrNames

    hunk ./ghc/docs/comm/the-beast/renamer.html 24 -like "f") or a pair of strings (for a qualified name like "M.f"). -Well, not quite just strings, because in Haskell a name like "C" could mean a type -constructor or data constructor, depending on context. So GHC defines a type -OccName (defined in basicTypes/OccName.lhs) that is a pair of -a FastString and a NameSpace indicating which name space the -name is drawn from: -
    -    data OccName = OccName NameSpace EncodedFS
    -
    -The EncodedFS is a synonym for FastString indicating that the -string is Z-encoded. (Details in OccName.lhs.) -

    -The name spaces are: -

    -So a RdrName is defined thus: +like "f") or a pair of strings (for a qualified name like "M.f"): hunk ./ghc/docs/comm/the-beast/renamer.html 38 +The OccName type is described in "The truth about names". +

    hunk ./ghc/docs/comm/the-beast/renamer.html 43 -

    -On the other hand, a Name: -

    -The original name of an entity (type constructor, class, function etc) is -the (module,name) pair describing where the thing was originally defined. So for example, -if we have -
    -  module M where
    -    f = e1
    -    g = e2
    -
    -  module A where
    -    import qualified M as Q
    -    import M
    -    a = Q.f + g
    -
    -then the RdrNames for "a", "Q.f" and "g" get replaced by the Names -"A.a", "M.f", and "M.g" respectively. -

    -Names come in two flavours: Local and Global. The Global kind contain -both a Module and an OccName -Not all Names are qualifed. Local (e.g. lambda-bound) names are given Local Names hunk ./ghc/docs/comm/the-beast/vars.html 29 -its unique number, and its print-name. The unique number is cached in the -realUnique field, just to make comparison of Vars a little faster. +its unique number, and its print-name. See "The truth about names". hunk ./ghc/docs/comm/the-beast/vars.html 31 -

  • The Type field gives the type of a term variable, or the kind of a +

  • The realUnique field caches the unique number in the +varName field, just to make comparison of Vars a little faster. + +

  • The varType field gives the type of a term variable, or the kind of a hunk ./ghc/docs/comm/the-beast/vars.html 62 + hunk ./ghc/docs/comm/the-beast/vars.html 212 -

    Global and Local Names

    +

    ExternalNames and InternalNames

    hunk ./ghc/docs/comm/the-beast/vars.html 215 -not the same as whether the Id has a Local or Global Name: +not the same as whether the Id has an ExternaName or an InternalName +(see "The truth about Names"): hunk ./ghc/docs/comm/the-beast/vars.html 218 -
  • Every GlobalId has a Global Name. +
  • Every GlobalId has an ExternalName. hunk ./ghc/docs/comm/the-beast/vars.html 221 -The significance of Global vs Local names is this: - - }