VARIABLE-LIST-ASYMMETRYThe allowed variations are indicated in the following chart:
do & do*: (var) (var init) (var init step) prog & prog*: var (var) (var init) n.a. let & let*: var (var val) n.a. compiler-let var (var value)
Note that just plain `` var '' is prohibited in do forms and that the case of ``(var)'' is prohibited in let forms and compiler-let forms.
I.e. change the variable-list in the syntax descriptions as follows:
do & do*: ( { var | (var [init [step]] ) }* ) let & let*: ( { var | (var [value] ) }* ) compiler-let: ( { var | (var [value] ) }* )
CL.
Any other way to make these cases consistent, such as either omitting just ``var'' from do & do* and prog & prog*, or omitting ``(var)'' from let & let* and prog & prog*, would be an incompatible change to the language. This way just adds the flexibility found in some of the forms to all of them.
KCL allows ``(var)'' in let & let* but not ``var'' in do & do*.
Symbolics Genera allows all three cases in all the forms; i.e. it conforms to this proposal.
The issue about whether the atomic ``var'' should be allowed at all in the variable lists for let & let* is a separate issue. (So is whether it should mean that the var is initially bound to nil.) Since it is allowed, this proposal merely says that the alternative syntax of an atom within a list with no initial value, ``(var)'', should also be allowed.