From: ludo@gnu.org (Ludovic Courtès)
To: Andy Wingo <wingo@pobox.com>
Cc: guile-devel@gnu.org
Subject: Re: for-each et al
Date: Tue, 04 Mar 2014 23:35:44 +0100 [thread overview]
Message-ID: <87ob1l383j.fsf@gnu.org> (raw)
In-Reply-To: <87wqg9ogf2.fsf@pobox.com> (Andy Wingo's message of "Tue, 04 Mar 2014 21:30:25 +0100")
Andy Wingo <wingo@pobox.com> skribis:
> On Sun 02 Mar 2014 22:27, ludo@gnu.org (Ludovic Courtès) writes:
[...]
>> I think an important difference you didn’t mention is that ‘list?’ does
>> its list traversal in C.
>
> That's true. Let's call the above version for-each*. Then we have
> for-each**, which is the same except it calls list*, which is:
>
> (define (list*? l)
> (let lp ((hare l) (tortoise l))
> (or (null? hare)
> (and (pair? hare)
> (let ((hare (cdr hare)))
> (or (null? hare)
> (and (pair? hare)
> (not (eq? tortoise hare))
> (lp (cdr hare) (cdr tortoise)))))))))
>
> Then we have:
>
> scheme@(guile-user)> (define l (iota 100000000))
> scheme@(guile-user)> ,time (for-each** (lambda (x) x) l)
> ;; 3.228201s real time, 3.223919s run time. 0.000000s spent in GC.
> scheme@(guile-user)> ,time (for-each* (lambda (x) x) l)
> ;; 2.356612s real time, 2.353496s run time. 0.000000s spent in GC.
> scheme@(guile-user)> ,time (for-each (lambda (x) x) l)
> ;; 3.142366s real time, 3.126806s run time. 0.000000s spent in GC.
>
> So the overhead of traversing the list twice is negligible in the worst
> case, and probably we still gain once the compiler gets better.
Yes.
>>> (lambda (f l)
>>> (unless (list? l)
>>> (scm-error 'wrong-type-arg "for-each" "Not a list: ~S" (list l) #f))
>>> (let for-each1 ((l l))
>>> (unless (null? l)
>>> (f (car l))
>>> (for-each1 (cdr l)))))
>
>> I’m OK with this implementation. I’ve never found myself iterating over
>> a list and modifying it concurrently.
>
> Yeah it's something that no one in their right mind does. But still we
> should have some kind of statement about what we guarantee -- currently
> the code is resilient to concurrent mutation, and we'd be relaxing that.
Right. R5 and R6 don’t say anything about that, but yes, we can add a
statement in the manual and NEWS to that effect.
I think the for-each change would be for 2.2, right?
>> I’m all in favor of immutable pairs. However, I expect that a lot of
>> code out there relies on it.
>>
>> Moving set-car! and set-cdr! to a different module like in R6 may be a
>> good first (or second) step.
>
> Brainstorming possibilities:
>
> * Deprecate set-car!/set-cdr! (replacement would be mutable cells in
> the car/cdr; currently called variables, but could be called boxes)
SRFI-111 boxes.
We should check a few existing packages and usage patterns before.
For instance, I suspect SCM_SETCAR/SCM_SETCDR are actually more
widespread than their Scheme counterparts, and probably much harder to
avoid. What can we do with them?
Another issue: what about elisp? It needs mutable pairs, but we don’t
want to have it use a disjoint type.
> * Introducing a #!lang facility, and having programs with #!lang make
> immutable pairs
Not really fan of the idea. :-)
Thanks,
Ludo’.
next prev parent reply other threads:[~2014-03-04 22:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-02 15:55 for-each et al Andy Wingo
2014-03-02 21:27 ` Ludovic Courtès
2014-03-04 20:30 ` Andy Wingo
2014-03-04 22:35 ` Ludovic Courtès [this message]
2014-03-05 19:59 ` Andy Wingo
2014-03-05 22:32 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ob1l383j.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=guile-devel@gnu.org \
--cc=wingo@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).