[LISPWORKS][Common Lisp HyperSpec (TM)] [Previous][Up][Next]


Issue LOOP-FOR-AS-ON-TYPO Writeup

Status:         Proposal FIX-TYPO passed 12/91

Issue: LOOP-FOR-AS-ON-TYPO

Reference: X3J13/89-004 page 2-10, CLtL/II page 721, and dict-flow.tex

Category: Clarify/fix-typo

Edit History: Version 1 20-Aug-91 by JonL

Problem Description:

From the draft proposal .tex file, under the subsection {\bf for-as-on-list},

the words:

In the {\it for-as-on-list\/} subclause,

the {\tt for\/}

or {\tt as\/} construct iterates over the contents of a

@type[list]. It checks for the

end of the @type[list] as if by using

@funref[endp].

were erroneously copied verbatim from the subsection {\bf for-as-in-list},

rather than the intended wording from the Iteration Subcommittee.

At one level, this prescription doesn't make sense; by saying that

it is iterating over the "contents", rather than down the successive cdrs,

of the list, there is confusion about the values assumed by the variable

[which is subsequently said to take on the "tails" of the list.]

In the spring of 1988, the Iteration Subcommittee suggested a change from

the then existing practice of terminating both LOOP-FOR-AS-IN and

LOOP-FOR-AS-ON by simply a NULL test. [Indeed, in the MacLisp days before

CommonLisp, ENDP didn't exist; and the common use of NULL rather than ATOM

was based on a performance hack for the PDP10 Architecture.] So ENDP was

specified for LOOP-FOR-AS-IN because that style views the list as a sequence

having "contents" or elements; but ATOM was specified for LOOP-FOR-AS-ON

since the only concern was the succession of list tails. The LOOP-FOR-AS-ON

case is intended to be more general -- and hence have a less restrictive

termination test -- so that user-defined iteration over non-standard

lists can be supported. But the current draft specification completely

and accidentally defeats this design.

Proposal (LOOP-FOR-AS-ON-TYPO:FIX-TYPO)

Restore the original wording as intended by the Iteration Subcommittee

as follows:

In the {\it for-as-on-list\/} subclause,

the {\tt for\/}

or {\tt as\/} construct iterates over a

@type[list]. It checks for the

end of the @type[list] as if by using

@funref[atom].

Editorial Impact:

Very small.

Rationale:

The evidence that this is a typo is in the Lucid Product Documentation

of about the same time that 89-004 was abstracted from it; this product

documentation has the "correct" wording, and the person responsible for

doing the abstracting simply copied over the wrong, albeit very

similarly worded paragraph. The two paragraphs are close together

in that text.

Without this fix, there will surely be gratuitous variations as to

how the termination testing is done for the LOOP-FOR-AS-ON case.

Current Practice:

Some existing implementations still adhere to the MacLisp inspired

version that used to be distributed from MIT, which simply used NULL

for both the FOR-AS-IN and the FOR-AS-ON cases; some adhere to a

later Common Lisp version that uses ENDP, at least for the FOR-AS-IN

case. Harlequin has apparently implemented the broken semantics of

"X3J13/89-004 page 2-10".

Discussion:

This typo has gone undetected for over two years, between January 1989

until about April 1991, when a fresh implementation of LOOP taken purely

"from the spec" produced anomalous results on LOOP-FOR-AS-ON termination

tests. Lawrence G. Mayka <lgm@iexist.att.com> noticed the variation when

comparing Harlequin's LOOP implementation with some of the others.

Jonl 11-Apr-91: I know this (the use of ATOM for FOR-AS-ON termination)

was discussed and agreed upon; and I hope that the forum of discussion

was within X3J13, either the iteration subcommittee or the whole

committee. I even recall changing Lucid's implementation after this

decision. [And an edit-history record of that change, along with the

rationale cited above, still exists in the Lucid source code for

Loop, dated 9-May-88.]


[Starting Points][Contents][Index][Symbols][Glossary][Issues]
Copyright 1996-2005, LispWorks Ltd. All rights reserved.