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

Proposal #5, or somewhere around there (rather long, constructive, and non-flaming(!))



Alternate proposal that has a declarative syntax, and is probably a lot
more comprehensible.

  [ &DECLARATIONS declares-var [ &DOC-STRING doc-string-var ]] &BODY body-var

If somebody wants to call it &DOCUMENTATION-STRING, go ahead; CLtL
usuually abbreviates "documentation-string" it to "doc-string".

Full semantics:
 - Since &BODY can only be used in macros, these extensions may
   only be used in macros.
 - &DECLARATIONS may only appear if &BODY appears.
 - &DOC-STRING may only appear if &DECLARATIONS appears.
 - If any of these extensions appear, they appear in the order given, on
   the grounds that is the normal order found within code.  It probably
   makes parsing defmacro's lambda-list a bit easier, and uniformity
   will make code easier to understand by other than the author.
 - declares-var is a catenation of the declarations.  If the original
   body had
	(declare (ignore a))
	(declare (ignore b) (inline aref))
   then declares-var would get bound to
	((ignore a) (ignore b) (inline aref))
 - If &DOC-STRING is present, the first string of the unpruned body is
   the documentation string, and parsing/pruning stops with the second
   string, which is considered part of the implicit progn.  [The
   exception is a string that is the last form of the body, in that case
   it is part of the implicit and not a doc-string, just like now.]
 - If &DOC-STRING is not present, then the first string stops the
   parsing/pruning of body.  Any declares after a string are part of the
   implicit progn and "are an error".  Presumably the code that groks
   implicit progns will complain about the presence of declares.
 - body-var is the body without the declarations and/or doc-string, and
   also with the first form NOT macroexpanded, even though
   macroexpansion was necessary to search for declarations and
   doc-strings.  If the first form is a macro, it may get expanded
   again.  Tough, macros shouldn't have side effects.

I believe this nests correctly, as all the other defmacro destructuring
does.  [Example deleted because even the simplest one is 16 lines long.]

I am willing to endorse this; I more-or-less believe it.  I do not
believe the original
	&BODY body-var [something-var [something-else-var]]
because it is totally lacking in syntax and comprehensibility.

Aside #1: I personally think &KEY and &BODY are mutually exclusive
because of their semantics; more-so when we worry about the presence of
declarations and a doc-string.  This is because the semantics of a body
includes an implicit progn, whereas the semantics of keyword/values is of
markers and values.  For those that do want &KEY and &BODY at the same
time it is probably necessary to require that the &KEY parsing happens
after the declarations/doc-string pruning.

Aside #2: If we had a simply specified PARSE-BODY, the simple
implementation of the above would be
	(multiple-value-bind (declares-var doc-string-var body-var)
	    (parse-body original-body want-doc-string environment)
	  ...)
I think we should have a (simply specified) PARSE-BODY even if (some)
extension to &BODY is adopted.  The compiler and special-form groker
need them for the same reason users want them for defmacro.  I think
PARSE-BODY and an &BODY extension should look very similar to each
other.  I believe the ideas in this messages show such a similarity.