[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: DECLARE SPECIAL Considered Confusing

    Date: Mon, 7 Jul 86 20:59 EDT
    From: David A. Moon <Moon@STONY-BROOK.SCRC.Symbolics.COM>
    To: Pavel.pa@Xerox.COM
    Subject: DECLARE SPECIAL Considered Confusing
    In-Reply-To: <860705-165424-2715@Xerox>
    Message-ID: <860707205952.2.MOON@EUPHRATES.SCRC.Symbolics.COM>
	Date: 5 Jul 86 16:54 PDT
	From: Pavel.pa@Xerox.COM
	I have a question concerning some ambiguity in the description of the
	scope of a special declaration inside a LET.  Consider this code:
		(setq foo 6)
		(let ((foo 7))
			(let ((foo (1+ foo)))
				(declare (special foo))
	Both Symbolics and CLISP return 8 for this, but VAXLISP returns 7.
    VAXLISP is incorrect here.  The SPECIAL declaration is pervasive for
    references (but non-pervasive for bindings).  Because SPECIAL is
    pervasive for references it affects the reference to foo inside 1+.
I don't wish to add to the confusion here, but my reading of pg 155
agrees with VaxLisp: the above example should return 7.  The outermost
LET binds a lexical var. named foo that is never referenced.  The
special declaration in the inner LET affects the variable being bound
by the LET (foo) and it affects the reference to foo in the explicit
body (i.e. the last reference to foo) and the reference to foo in the
init-form in the inner LET is also special.  The global value of foo
is 6, and 6 + 1 = 7.

-- Nick