|  | 11 Packages  11.1 Package Concepts  11.1.1 Introduction to Packages  11.1.1.2 Symbols in a Package 11.1.1.2.5   Prevention of Name Conflicts in PackagesWithin one package, any particular name can refer to at most one
symbol.  A name conflict is said to occur when there would be more than
one candidate symbol.  Any time a name conflict is about to occur,
a correctable error is signaled.
The following rules apply to name conflicts:
 
--
Name conflicts are detected when they become possible, that is, when the
package structure is altered.  Name
conflicts are not checked during every name lookup.
--
If the same symbol is accessible to a package 
through more than one path, there is no name conflict.
A symbol cannot conflict with itself. 
Name conflicts occur only between distinct symbols with
the same name (under string=).
-- Every package has a list of shadowing symbols.  
A shadowing symbol takes precedence over any other symbol of
the same name that would otherwise be accessible in the package.  
A name conflict involving a shadowing symbol is always resolved in favor of
the shadowing symbol, without signaling an error (except for one
exception involving import).
See shadow and shadowing-import.
-- 
The functions use-package, import, and 
export check for name conflicts.  
-- 
shadow and shadowing-import 
never signal a name-conflict error.
-- 
unuse-package and unexport
do not need to do any name-conflict checking.
unintern does name-conflict checking only when a symbol 
being uninterned is a shadowing symbol.
-- 
Giving a shadowing symbol to unintern 
can uncover a name conflict that had
previously been resolved by the shadowing.  
  -- 
  Package functions signal name-conflict errors of type package-error before making any
  change to the package structure.  When multiple changes are to be made,
  it is
  permissible for the implementation to process each change separately.
  For example, when export is given a 
list of 
symbols,
  aborting from a name
  conflict caused by the second symbol 
  in the list might still export the
  first symbol in the list.  
  However, a name-conflict error caused by export
  of a single symbol will be signaled before
  that symbol's accessibility in any package is changed.
-- 
Continuing from a name-conflict error must offer the user a chance to
resolve the name conflict in favor of either of the candidates.  The
package 
structure should be altered to reflect the resolution of the
name conflict, via shadowing-import, 
unintern,
or unexport.
-- 
A name conflict in use-package between a symbol 
present in the using package and an external symbol of the used 
package is resolved in favor of the first symbol by making it a
shadowing symbol, or in favor of the second symbol by uninterning
the first symbol from the using package. 
-- 
A name conflict in export or unintern 
due to a package's inheriting two distinct symbols 
with the same name (under string=)
from two other packages can be resolved in
favor of either symbol by importing it into the using
package and making it a shadowing symbol,
just as with use-package.
 |