[r6rs-discuss] [Formal] last-element behavior of for-each

From: AndrevanTonder <andre>
Date: Fri Oct 6 17:12:57 2006

On Fri, 6 Oct 2006, Marcin 'Qrczak' Kowalczyk wrote:

> John Cowan <cowan_at_ccil.org> writes:
>
>> If we don't care about the results of the function on any of the
>> preceding elements, why are we likely to care on the final elements,
>> indeed? I don't remember ever using for-each for anything but effect.
>
> But I agree that it's perhaps not worth the trouble, i.e. that
> programmers shouldn't expect a tail call here.

Is one extra line in the definition (assuming 1-arg case) that much more
trouble, though?

With the current spec, one has the nice correspondence:

   (for-each f '(1 2 3)) == (begin (f 1) (f 2) (f 3))

whereas the alternative advocated here would be more complex, e.g.:

   (for-each f '(1 2 3)) == (begin (f 1) (f 2) (f 3) (unspecified))

The fact that, in the proposed modification, the last call to f is not a tail
call, will adversely affect the space behavious of useful programs. Here is a
natural example:

   (define (print-list list)
     (for-each (lambda (node)
                 (if (not (pair? node))
                     (display node)
                     (print-list (car node))))
               list)

It is easy to exhibit an s-expression for which the r6rs semantics will have
constant space behaviour, whereas the proposed modification would need space
proportional to the size of the s-expression to run.

I would therefore vote for the current tail-recurive specification.

Cheers
Andre
Received on Fri Oct 06 2006 - 17:10:35 UTC

This archive was generated by hypermail 2.3.0 : Wed Oct 23 2024 - 09:15:01 UTC