CLHS: Issue LOOP-AND-DISCREPANCY Writeup

#

## Issue LOOP-AND-DISCREPANCY Writeup

    Issue:		LOOP-AND-DISCREPANCY

    References:	Loop Facility document X3J13/89-004

    Related issues:

    Category:	CHANGE CLARIFICATION

    Edit history:	Version 1, 15-Mar-88 by Steele

    Problem description:

    The treatment of the AND conjunction in FOR/AS and WITH clauses is not
    consistent.  Examples of the use of WITH are also not consistent in this
    respect.

    Page 2-5 implies by example that when AND is used to join two
    FOR/AS clauses, the word FOR or AS must occur after the word AND.

    Page 2-31 has formal syntax specifying that when AND is used to join two
    WITH clauses, the word WITH must *not* occur after the word AND.  Examples
    on that page are consistent with this specification.

    Page 2-41 has an example in which WITH is repeated after AND.

    Proposal (LOOP-AND-DISCREPANCY:NO-REITERATION):

    Let stand the formal syntax for WITH.

    Change the description of FOR/AS clauses to specify that when
    two or more such clauses are joined with AND, clauses after the
    first do not have FOR or AS before them.

    The complete formal syntax for FOR/AS may be described as follows:

    for-as ::= {FOR | AS} for-as-subclause {AND for-as-subclause}*

    for-as-subclause ::= for-as-arithmetic | for-as-in-list
    		   | for-as-on-list | for-as-equals-then
    		   | for-as-across | for-as-hash | for-as-package

    for-as-arithmetic ::= var [type-spec] ...

    and so on.

    Examples:

    > (loop for x from 1 to 10		;Corrected from X3J13/89-004, page 2-5
            and y = nil then x
            collect (list x y))
    ((1 NIL) (2 1) (3 2) (4 3) (5 4) (6 5) (7 6) (8 7) (9 8) (10 9))

    > (loop with (a b) float = '(1.0 2.0)	;Corrected from X3J13/89-004, page 2-41
            and (c d) integer = '(3 4)
            and (e f)
            return (list a b c d e f))
    (1.0 2.0 3 4 nil nil)

    Rationale:

    The treatment of AND should be internally consistent.  There is no reason
    to repeat the FOR/AS keyword.  Not repeating the keyword emphasizes that
    the subclauses are functionally linked under the heading of WITH or FOR.
    (Compare to the third use of AND in LOOP, to link clauses controlled
    by WHEN/IF/UNLESS.  One does not repeat the WHEN; rather, the clauses
    grouped by AND are controlled by a single WHEN.)

    Current practice:

    Symbolics LOOP allows FOR to be included or omitted after AND,
    with identical meanings.  WITH may not be repeated after AND.

    Cost to Implementors: Small?

    Cost to Users: Possible incompatibility with existing implementors' extensions.

    Cost of non-adoption:  Utter confusion.

    Performance impact:  None.

    Benefits:  Consistent treatment of AND within LOOP.

    Esthetics:

    Absolutely none.  We're talking about LOOP here.

    Discussion:

    Steele supports this proposal.  It is a reversal of his previous
    suggestion on the topic, thanks to feedback from Moon.

Copyright 1996-2005, LispWorks Ltd. All rights reserved.