Subject: Re: (declare (lexical ...))
From: Erik Naggum <erik@naggum.no>
Date: 1996/04/15
Newsgroups: comp.lang.lisp
Message-ID: <3038580500648680@arcana.naggum.no>

[Thomas A. Russ]

|   One has to consider what the alternatives are.  The expression 
|   
|     (setq foo bar) 
|   
|   at top-level does not have any lexical scoping forms.  I can think of
|   three possible ways to deal with this:
|   
|     (1)  Implicitly wrap a lexical scope around the form.
|     (2)  Signal an error for an undeclared variable.
|     (3)  Implicitly make "foo" special (and warn).

I think I see a deep mistake I have made here, but it's somewhat slippery.
there are bound and free variables.  free variables are assumed to be found
in an enclosing environment; if not, they cause errors.  free variables at
top-level are not found in any environment, and is therefore in an error
situation, anyway, so anything goes?

|   This is what every lisp I have ever encountered does.

that's odd.  I'm using CMUCL 17f, CLISP 1996-03-15, WCL 2.2, and XLISP
2.1g.  among them, only CMUCL implicitly declares top-level setq'd
variables special.  incidentally, (set 'foobar 42) in CMUCL does not
declare `foobar' special, while (setq foobar 42) does.  clearly, this is a
hack.

is there anything in ANSI CL that could be construed as a requirement or at
least a helpful hint as to how this situation should be handled?

(I'm still interested in how one would "undo" a top-level (pervasive?)
special declaration.)

#<Erik>
-- 
education is for people who can't handle reality the hard way