[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Packages: where is the beef ?
> According to my simple minded intuition, packages are name scopes in which I can
> define what ever symbols I want to without having conflicts.
> Unfortunately, is is NOT true in Common Lisp (at least not in Allegro
> Common Lisp).
Still too simple -- besides a package having it's own symbols, it also
inherits symbols from the package(s) it uses.
Thus, (eq 'MY-PACKAGE::ASSERT 'ASSERT 'COMMON-LISP::ASSERT) => t.
> First I tried to make my own structure named 'ASSERT' in my own private
> package.
But it wasn't; it was actually in the COMMON-LISP package.
Check the value of (symbol-package 'ASSERT) when in your package.
Here are some of the possible work-arounds:
1. If you are not going to use ASSERT often, you can shadow it in your
package, so that MY-PACKAGE::ASSERT will be seen instead.
If you still want to use COMMON-LISP:ASSERT, you can by qualifying it
explicitly with a package name (the package name, or one of its nicnames).
2. You can create a separate package (say, MY-STRUCTS) which does not
USE-PACKAGE the lisp package, and put your structure definition in it,
then export the creation and accessor functions. You don't want to
export ASSERT from MY-STRUCTS it you plan to use the MY-STRUCTS package.
If you need to refer to it, you may by explicit qualification: MY-STRUCTS::ASSERT.
The same thing goes for CLASS. Since these symbols are in the LISP
package, the various structure/class functions/methods which get
created are created in the symbol-package of the name of the
structure/class. This is the LISP package, but the LISP package is
locked (for your own protection), thus the error you witnessed.
-todd