[Openmcl-devel] LOOP parallel for/as termination eval order issue.

Jon Anthony j-anthony at comcast.net
Mon Oct 18 10:30:04 PDT 2010


Might this be a bug in their (CLisp) loop invariant hoisting code?  What
happens in the expansion if you use a non-constant invariant?

/Jon

On Mon, 2010-10-18 at 09:32 -0700, Kaz Kylheku wrote:
> On Mon, 18 Oct 2010 05:56:47 -0600 (MDT), Gary Byers <gb at clozure.com>
> wrote:
> > On Sun, 17 Oct 2010, Kaz Kylheku wrote:
> >> Look at that! CLISP's loop assiduously performs
> >> all the assignments, prior to the first iteration,
> >> and only then evaluates the termination conditions
> >> associated with the clauses prior to the loop
> >> body.
> > 
> > No it doesn't.  If you don't believe me, macroexpand your
> > example in CLISP and look at what actually happens.
> 
> You are right. The behavior differs based on the nature of the
> forms involved.
> 
> For instance:
> 
> [32]> (loop for x in nil for y = m2 finally (return y))
> NIL
> [33]> (loop for x in nil for y = 2 finally (return y))
> 2
> [34]> m2
> 2
> [35]> m1
> nil
> 
> (m1 and m2 happen to be symbol macros denoting function
> call forms, which may not matter).
> 
> It looks like CLISP moved the assignment ahead of the
> termination test because of Y being initialized with a constant,
> which being what it is, cannot depend on any of the other
> initializations.
> 
> But in the real code I don't have such a trivial constant;
> I think I have not uncovered the real root cause of the
> portability issue.
> 
> Furthermore, I am seeing a problem problem in which
> the list being walked isn't empty (a stepping issue, not
> an initialization problem).
> 
> > that your model will remain inaccurate.
> 
> Would it be fair to say:
> 
> The de-facto correct model (say, by implementation popularity)
> seems to be that the iteration control clauses are somewhat
> like statements and are performed in order, and that includes
> triggering early termination, pre-empting subsequent
> termination clauses (this not being spelled out in the
> spec). Termination testing is not factored out into a separate
> termination testing phase.
> 
> Furthermore, if any initializations are skipped by an
> earlier termination tests, the values of those variables
> are unspecified.
> 
> CLISP may be implementing that model, but changing some
> aspects of it by moving things around when it seems
> innocuous to do so that it in those cases it seems as
> like a different model.
> 
> Certainly, the treatment of the y = 2 versus
> y = m2 above is inconsistent. The difference is allowed
> by a model which allows y to have any value at all if its
> initialization is skipped.
> 
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel




More information about the Openmcl-devel mailing list