Package-local nicknames are similar to package nicknames, except the
nickname applies only when *package* is set to the desired
package that has defined local nicknames.
For example, a short nickname can be used for a long package name as
follows, using the new :local-nicknames option that takes a
list of lists of the form (local-nickname actual-package) that
describes the local nickname and the corresponding actual package:
(defpackage "A-VERY-LONG-PACKAGE-NAME"
(:intern "A-SYMBOL"))
(defpackage "MY-PACKAGE"
(:use "CL")
(:local-nicknames ("SHORTY" "A-VERY-LONG-PACKAGE-NAME")))
...
(let ((*package* (find-package "MY-PACKAGE")))
(find-symbol "A-SYMBOL" "SHORTY")) => A-VERY-LONG-PACKAGE-NAME::A-SYMBOL
Thus, when *package* is the package "MY-PACKAGE", we can use
"SHORTY" to refer to symbols from "A-VERY-LONG-PACKAGE-NAME".
Support for package-local nicknames in CMUCL is indicated by having
:package-local-nicknames in *features*.
A continuable error is signaled if any of the following are true for
the local nickname for the actual-package
(see add-package-local-nickname).
local-nickname is already a local nickname for a different actual-package
local-nickname is one of “CL”, “COMMON-LISP”, or “KEYWORD”
To support package-local nicknames, defpackage has a new option
named :local-nicknames that takes a list of lists specifying
the local nickname for the actual package. For example
(defpackage my-package
(:local-nicknames {(local-nickname global-package-designator)}*))
defines local-nickname as a package-local nickname for the
package global-package-designator. local-nickname must
be string-designator
and global-package-designator must be a
string-designator or
package object. Any number of such pairs is allowed.
However, the values of local-nickname and global-package-designator
must satisfy the same constraints as mentioned in
add-package-local-nickname.
Local nicknames affect the reading and printing of symbols in the defined-package-name allowing you to use (potentially) shorter names to reference other packages with longer names. The nickname is used when printing the symbols as well.
For example
(defpackage :bar (:intern "X")) (defpackage :foo (:intern "X")) (defpackage :quux (:use :cl) (:local-nicknames (:bar :foo) (:foo :bar))) (find-symbol "X" :foo) ; => FOO::X (find-symbol "X" :bar) ; => BAR::X (let ((*package* (find-package :quux))) (find-symbol "X" :foo)) ; => BAR::X (let ((*package* (find-package :quux))) (find-symbol "X" :bar)) ; => FOO::X
The package :quux defines two local nicknames: :bar and
:foo. When *package* is set to the package
:quux, the package prefix foo:: is a nickname for the
package :bar. Hence, the symbol with the name “X” in the
package :foo is really the symbol BAR::X.
Returns an alist of (local-nickname . actual-package)
describing all of the nicknames local to the designated-package.
From the example above, we have
(package-local-nicknames :quux) =>
(("FOO" . #<The BAR package, 1/9 internal, 0/2 external>)
("BAR" . #<The FOO package, 1/9 internal, 0/2 external>))
When in the designated-package, calls to find-package
with any of the local nicknames will return the actual-package
instead.
When printing a symbol with a local-nickname, the local-nickname is
printed for the package instead of the actual-package.
Thus,
(let ((*package* (find-package :quux))) (print (find-symbol "X" :foo)) (values)) => FOO::X
Returns a list of packages which have a local nickname for designated-package.
&optional {(package *package*)} ¶For the given package, the local-nickname is added as a local nickname for actual-package. Both actual-package and package must be a package designator. local-nickname should be a string designator.
Returns the package.
A continuable error is signaled if any of the following are true:
&optional {(package *package*)} ¶If package has old-nickname as a local nickname, it is
removed from the list of package-local nicknames in the package
package. Returns non-nil if old-nickname existed.
Otherwise returns nil.