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


This version tries to fix the wording problems mentioned by JonL.

References:	CLtL p. 66-70, 143
Edit History:   6-May-88, V1 by Sandra Loosemore
		9-Jun-88, V2 by Sandra Loosemore
		12-Sep-88, V3 by Sandra Loosemore (fix garbled section 4)
                21-Sep-88, V4 by Sandra Loosemore (clarify section 5)
		16-Dec-88, V5 by Sandra Loosemore (major restructuring)
		31-Dec-88, V6 by Sandra Loosemore (wording clarifications)

Problem Description:

CLtL leaves the interpretation of defining forms such as DEFMACRO and
DEFVAR that appear in other than top-level locations unclear.

On page 66, it is stated: "It is not illegal to use these forms at
other than top level, but whether it is meaningful to do so depends on
context.  Compilers, for example, may not recognize these forms
properly in other than top-level contexts".  At least one implementation 
has interpreted this to mean that it is permissible to simply refuse
to compile defining macros that do not appear at top-level.


(1) Remove the language from p. 66 of CLtL quoted above.  Clarify that
while defining macros normally appear at top level, it is meaningful
to place them in non-top-level contexts and that the compiler must
handle them properly in all situations.  However, the compile-time side
only take place when the defining macros appear at top-level.

(2) Remove the language on p. 145 of CLtL, which states that macro
functions are always defined in the null lexical environment.  Clarify
that all defining macros which create functional objects (including
DEFMACRO, DEFTYPE, DEFINE-SETF-METHOD, and the complex form of
DEFSETF, as well as DEFUN) must ensure that those functions are
defined in the lexical environment in which the defining form is

(3) Define a ``top-level form'' as follows:

    - Each form read by COMPILE-FILE from the input file is a top-level 

    - Forms within the body of a top-level PROGN, EVAL-WHEN, or 
      COMPILER-LET are also top-level forms.

    - The expansion of a top-level macro call is also a top-level form.

Top-level forms would be evaluated by the interpreter in a null
lexical environment, but that evaluation in a null lexical environment
does not necessarily imply that the form is top-level.

(4) Specify that top-level forms in a file being compiled are
guaranteed to be processed sequentially, including forms within the
body of a top-level PROGN, EVAL-WHEN, or COMPILER-LET.  The order in
which non-top-level subforms of a top-level form are processed by the
compiler is explicitly left unspecified.


The notion of a ``top-level form'' is rather confused, since the term
is used in CLtL to refer both to a place where a form may appear (what
this proposal continues to call ``top-level''), and to instances of
forms which traditionally appear there (what this proposal calls
``defining macros'').  

There has been a suggestion that the notion of a top-level form should
be extended to include forms in the body of a top-level LET, to allow
forms such as DEFUN to be meaningful there.  However, we feel that a
cleaner solution is to remove the restrictions on the placement of
defining macros altogether. 

The motivation for item (4) is that it allows compilers to perform
certain kinds of source-to-source transformations that change the
order of subforms.

Current Practice:

CLtL mentions only that forms within a top-level PROGN, and not 
COMPILER-LET, are treated as top-level.  However, COMPILER-LET is
also treated specially in implementations derived from the MIT Lisp
Machine (TI and Symbolics), as well as Lucid and Coral (but not

Cost to implementors:

Implementations that currently don't compile defining macros correctly
when they appear at non-top-level will have to be changed.

Cost to users:

None.  This is a compatible extension.


The notion of defining macros as being somehow special when they
appear at top-level is removed.  Allowing defining macros to appear
anywhere instead of restricting them to certain positions results in a
cleaner language design.


This proposal is consistent with the behavior specified in proposal
EVAL-WHEN-NON-TOP-LEVEL:IGNORE-COMPILE.  In particular, if the compile
time side-effects for defining macros specified in proposal
EVAL-WHEN, the "right" compiler behavior for defining macros at
non-top-level will happen automatically.

Note that proposal COMPILER-LET-CONFUSION:ELIMINATE would remove 
COMPILER-LET from the language entirely.