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

Macros -> declarations



    Date: Monday, 6 May 1985, 11:43-EDT
    From: Guy Steele <gls%AQUINAS@THINK.ARPA>

    I would be not at all unhappy if this feature were to go away.
    I agree that Scott's assessment that it is unlikely that any
    existing code (outside of diagnostic tests for this very feature)
    would be harmed.

I have no opinion one way or the other about whether the feature of macros
expanding into DECLARE forms should be retained or flushed.  Maybe we'll
hear from KMP what he had in mind when he suggested it, back in 1982 or
thereabouts, before we make a decision.

I would like to point out, though, that anyone claiming that no one uses
the feature is on very thin ice.  A hell of a lot of copies of Common
Lisp: The Language have been sold.  I have heard of more than one
implementation existing "off in left field".  My experience has been
that users will often use features that you wouldn't have expected them
to use, or even discover, and then will get mad when you remove the
feature.  The worst case of this, of course, is when the user thought it
was a feature and the implementor thought it was a bug.

    I am persuaded not at all by the argument that it is hard to implement.
    I am mildly swayed by the efficiency considerations for the interpreter.

I found it easy enough to implement an interpreter that handles these efficiently.
It pre-processes certain special forms the first time it encounters them.  No
big deal.

    The convincing point to me, however, is that the facility is likely
    to confuse macro-writers (who do, indeed, frequently find it necessary
    to find the division point between declarations/documentation and body).

    As a proposal separate from the question of eliminating the expansion
    of macros into declarations, I suggest the following primitive
    for consideration:

    PARSE-BODY list

    The list is treated as a body (a list of forms) that may have declarations
    and a documentation string at its head.

    Three values are returned.  The first is some tail of the list,
    the executable part of the body.  The second value is a list
    of declarations (lists whose car is DECLARE) at the head of the body.
    The third value is the documentation string, or NIL if there was
    no documentation string.

This is a good suggestion.  We already have this, but haven't documented it
pending standardization or other reasons why we might want to change it.  Our
implementation of this raises some points:

 - It needs to take a lexical environment argument so it can expand macros
   so it can look for declarations.

 - It needs to take an argument that tells it whether documentation strings
   are allowed in this kind of body.

 - It's convenient for the caller if PARSE-BODY peels off the DECLARE's and
   simply returns a one-level list of declarations.  The caller can cons
   DECLARE back onto the front of this list if desired.

 - For our system's applications, we found it convenient to split the
   declarations into four kinds returned as separate lists.  I don't
   know that it would make sense to standardize this in Common Lisp,
   though.  The four kinds were SPECIAL declarations, type declarations,
   declarations that need to be saved until run time for the Debugger
   (not a portable concept), and all others.