Stuart Sierra writes:
> Pascal Bourguignon <[EMAIL PROTECTED]> writes:
> > Jonathan Fischer writes:
> >> Ditto the thanks!  I've a question though: is there any difference
> >> between using the keyword symbols and normal symbols in the exports
> >> list?
> >
> > Yes.
> > Try this:
> >
> > (in-package :cl-user)
> > (defpackage mypackage
> >   (:use :common-lisp)
> >   (:export foo bar))
> > (use-package 'mypackage)
> >
> > Remember that symbols are interned by the reader when they are read,
> > in the current package.
> >
> > You can use :keywords, or #:uninterned-symbols, or "STRINGS".
> 
> I was thinking, as I wrote about colon syntax (glad people
> liked it, by the way) that it would be helpful to explain
> the various ways of identifying symbols by name when
> creating packages and the like.  Many standard macros accept
> 1) normal interned symbols, 2) keyword symbols, 3)
> uninterned symbols, or 4) strings.  I think the HyperSpec
> calls these arguments "designators."
> 
> It's not always clear which form one should use, and
> different styles abound.  Is there a "standard" way?

Well, it works by elimination.

For example, the LOOP macro only uses the symbol names of its key words.
So you can use :WHILE #:WHILE, WHILE, THIS-PACKAGE:WHILE, or THAT-PACKAGE:WHILE.

But if you use WHILE, you will eventually encounter the case where
you've interned this WHILE in the current package by using it in a
LOOP form and suddenly you're trying to impor a symbol named WHILE
from some other package, and you get a name collision.  So you
eliminate this use case, and choose :WHILE, because it let you avoid
this name collision, and is shorter than #:WHILE, or
THIS-PACKAGE:WHILE.

Same with DEFPACKAGE et al., where you can use string designators,
that is symbols or strings.  As I explained, using symbols newly
interned in the current package will give name collisions when you
later try to import (use-package) the package you just defined. So you
eliminate this use case.  Using keywords leads to a big pollution of
the KEYWORD package: for all exported symbol, you have a duplicate
symbol in the KEYWORD package.  Using uninterned symbols is ugly
#:sym, and you lose more space than with strings, since you have to
allocate a symbol in addition to the symbol name.  So by elimination,
you see that the best is to use only strings in these macros.

Since writing a keyword is easier than writing a string, for
interactive use, it's acceptable to use keywords instead of strings,
but in programs, I always use strings, to avoid growing indefinitely
the KEYWORD package.



Note that this reasoning doesn't appear in any text (well, now it
appears in this message, and I may have already explained it in cll).
But you can just think it out yourself, just knowing what happens when
you write the various cases:

symbol
:symbol
#:symbol
"SYMBOL"

Which is explained in excruciating details in the second and twenty
third chapters of CLHS, or explained more or less formally in any CL
tutorial.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
Kitty like plastic.
Confuses for litter box.
Don't leave tarp around.
_______________________________________________
Gardeners mailing list
[email protected]
http://www.lispniks.com/mailman/listinfo/gardeners

Reply via email to