[HARLEQUIN][Common Lisp HyperSpec (TM)] [Previous][Up][Next]


Issue DEFCONSTANT-SPECIAL Writeup

Forum:		Compiler

Issue: DEFCONSTANT-SPECIAL

References: CLtL p. 68-69, 55-56

Issue DEFCONSTANT-NOT-WIRED

Issue PROCLAIM-LEXICAL

Issue SYNTACTIC-ENVIRONMENT-ACCESS

Issue SPECIAL-VARIABLE-TEST

Category: CLARIFICATION

Edit History: V1, 15 Nov 1988, Sandra Loosemore

V2, 22 Nov 1988, Sandra Loosemore

V3, 30 Dec 1988, Sandra Loosemore

V4, 23 Jan 1989, Sandra Loosemore (amendment)

Status: Proposal DOESNT-MATTER passed Jan 1989

Problem Description:

It is unclear whether DEFCONSTANT is supposed to proclaim the variable

SPECIAL. Page 56 says that symbols defined by DEFCONSTANT "may not be

further assigned to or bound". Page 69 says that "further assignment

to or binding of that special variable is an error" but permits

compilers to "choose to issue warnings about bindings of the lexical

variable of the same name". Does this mean that it is legal (but

perhaps only questionable style) to lexically rebind constants? If

so, this would seem to imply that they must not be proclaimed SPECIAL

(since CLtL provides no way to override a SPECIAL proclamation).

Some people think that DEFCONSTANT is supposed to proclaim the

variable SPECIAL because CLtL says that DEFVAR does, and that

DEFPARAMETER is like DEFVAR, and DEFCONSTANT is like DEFPARAMETER.

Also, the use of the phrase "that special variable" rather than "the

special variable of the same name" might indicate that the variable

really is supposed to be special.

Proposal DEFCONSTANT-SPECIAL:DOESNT-MATTER:

Clarify that it is an error to rebind constant symbols as either

lexical or special variables. (In other words, a reference to a

symbol declared with DEFCONSTANT always refers to its global value.)

Rationale:

Clarifying that lexical rebinding (as well as special rebinding) of

constants "is an error" seems to be the behavior that most users

expect. One serious problem that might arise from allowing constants

to be rebound lexically is that it would not be reliable to include

symbolic constants in macro expansions, because the user might have

rebound them to something else.

Current Practice:

Most implementations apparently proclaim the variable special anyway.

Cost to implementors:

Minor.

Cost to users:

Probably none. Since many implementations do proclaim the variable to

be special (while at the same time forbidding special binding), there

is probably no user code that depends upon lexical rebinding of

DEFCONSTANTs.

Benefits:

An area of confusion in the language is removed.

Discussion:

This issue is primarily a documentation clarification. It arose

during a discussion of what the DEFCONSTANT macro might expand into.

As far as users are concerned, it makes no difference whether

constants are special or lexical, as long as all rebinding is

prohibited. The only situation where the distinction might become

important is if a function is added to the language to test whether a

variable has been proclaimed special.

The "problem description" section of the writeup on issue

PROCLAIM-LEXICAL (version 8) also appears to assume that constants

declared with DEFCONSTANT are not special.


[Starting Points][Contents][Index][Symbols][Glossary][Issues]
Copyright 1996, The Harlequin Group Limited. All Rights Reserved.