[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
type declarations of special bindings
Date: Sat, 23 Jan 88 01:18:23 PST
From: Jon L White <edsel!jonl@labrea.Stanford.EDU>
re: In the following example, does the fixnum declaration apply to the
inner reference to X (in the setq)?
(let ((X 17))
(declare (special X) (fixnum X))
(let ((X 'local))
(locally
(declare (special X))
(setq X (foo)))))
CLtL, p 158 says that type declarations affect the binding "and specifies
that the variable[s] mentioned will take on values only of the specified
type". The inner reference is to the variable bound specially, not to
the one bound locally, so it is the same variable whose binding was
declared fixnum. Hence, in theory, it should be as if the form
(setq X (foo))
were written as
(setq X (the fixnum (foo)))
but I suspect very few, if any, compilers actually make this leap of type
inferencing.
-- JonL --
I agree with your interpretation.
I don't think it's much of a leap of inferencing, at least not for
any way that I would think to write a compiler. Most compilers
create some sort of "VAR" structure where information about a
variable is stored. After all, code generation has to make exactly
the same leap of inferencing, to figure out just where to get the
variable *from*.
But I have no comment as to whether existing compilers actually
do or do not (as you suggest) actually do anything with this.
My point is just that it isn't a burden for any well-designed
compiler.
Note that there's no actual obligation that the compiler generate
code to enforce it; there's just an obligation that the user not
write code which violates it. (I don't see any way a compiler
could handle this in an *illegal* way.)