When you use setq to bind the top level value of an
atom, you will see the following warning from common lisp:
Warning: Declaring special.
Just ignore this.
( For those who are really interested in what it means:
special is common lisp's way of indicating a dynamically scoped
variable. There are two ways to decide on the scope of a variable -
this means if you haven't defined it in the local environment, how do
you look elsewhere for the value. lexical scoping says you
should look in the place where the environment was defined to see if
there's a binding of the parent. An example is in slide lp30, the
variable z was used in the lambda expression but not defined -
this was borrowed from the surrounding lambda. Most algol-like
langauges use lexical scoping. The other choice is called dynamic
scoping, where the fucntion will look for the definition that
called it. Most early lisp implementations used dynamic
scoping. This was known for a while as the dynamic scoping bug, since
it can lead to unpredictable results if you are not careful. Scheme
and some more modern lisps used lexical scoping (fixing the bug). When
they defined common lisp, many people wanted to use dynamic scoping as
well, for backward compatibility. So common lisp is a compromise: it
has both kinds of scoping - variables defined as the parameters to
functions are (generally) static, and variables defined by setq are
special (dynamic). You can actually mix and match these and get some
very weird results in common lisp!)