From: ludo@gnu.org (Ludovic Courtès)
To: Mark H Weaver <mhw@netris.org>
Cc: guix-devel@gnu.org
Subject: Re: Optimizing union.scm
Date: Tue, 25 Mar 2014 23:58:32 +0100 [thread overview]
Message-ID: <87y4zx3mxz.fsf@gnu.org> (raw)
In-Reply-To: <87ob0tkj1p.fsf@yeeloong.lan> (Mark H. Weaver's message of "Tue, 25 Mar 2014 18:30:42 -0400")
Mark H Weaver <mhw@netris.org> skribis:
> ludo@gnu.org (Ludovic Courtès) writes:
>
>> Mark H Weaver <mhw@netris.org> skribis:
[...]
>>> * I've not yet updated tests/union.scm, which tests internal procedures
>>> in union.scm that no longer exist.
>>
>> Right, the ‘tree-union’ and ‘delete-duplicate-leaves’ tests will have to
>> be removed.
>>
>> However, could you add similar tests? They will have to use the real
>> ‘union-build’, though. Maybe the ‘with-file-tree’ can be useful to
>> write the tests.
>
> Could you help with this? I'm a bit overloaded right now.
OK, I’ll add a few tests.
>> Some stylistic comments:
>>
>>> (define (names-in-directory dirname)
>>> (let ((dir (opendir dirname)))
>>> (let loop ((filenames '()))
>>> (match (readdir dir)
>>> ((or "." "..")
>>> (loop filenames))
>>> ((? eof-object?)
>>> (closedir dir)
>>> filenames)
>>> (name
>>> (loop (cons name filenames)))))))
>>
>> Rather use something like:
>>
>> (scandir directory (lambda (file)
>> (not (member file '("." "..")))))
>>
>> ‘scandir’ also has the advantage of being deterministic (it sorts
>> entries.)
>
> I looked at 'scandir', but it's very wasteful. For one thing, it
> unconditionally calls 'lstat' on every directory entry, which entails
> over ten thousand unnecessary 'lstat' system calls, a lot of unnecessary
> I/O to read the inodes, the use of a vhash to keep track of where it has
> been to detect cycles (since it's based on 'file-system-fold'), etc.
Oh right, makes sense.
Then just s/filenames/files/ and (sort files string<?) at the end.
>>> (format log-port "`~a' ~~> `~a'~%" input output)
>>> (symlink input output))
>>>
>>> (define (union output inputs)
>>> (match inputs
>>> ((input)
>>> ;; There's only one input, so just make a link.
>>> (make-link input output))
>>> (_
>>> (receive (dirs files) (partition directory? inputs)
>>
>> Rather SRFI-11 let-values.
>
> Hmm. In simple cases like this, I find 'receive' much more attractive
> than 'let-values', since the latter would involve triple-nested parens,
> which is a bit much even for me.
>
> Can you explain why you prefer 'let-values' to 'receive' in this case?
Because I’m used to it, but here it’s mostly for consistency.
> Also, how do you feel about 'call-with-values'? In an earlier draft of
> this code, I used 'call-with-values' with 'match-lambda*' as the
> consumer, which eliminated the need for the 'cond'. Would you prefer
> that?
Yeah I don’t feel too strongly, so whatever you find appropriate. :-)
Thanks!
Ludo’.
next prev parent reply other threads:[~2014-03-25 22:58 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-12 7:12 Problems with handicapped 'bash' from glibc package Mark H Weaver
2014-02-12 13:14 ` Ludovic Courtès
2014-02-12 17:39 ` Mark H Weaver
2014-02-12 19:31 ` Andreas Enge
2014-02-12 20:33 ` Ludovic Courtès
2014-02-12 21:33 ` Mark H Weaver
2014-02-13 9:14 ` Andreas Enge
2014-03-23 16:19 ` Ludovic Courtès
2014-03-23 20:19 ` Mark H Weaver
2014-03-23 20:27 ` Ludovic Courtès
2014-03-24 3:31 ` Mark H Weaver
2014-03-28 13:48 ` Ludovic Courtès
2014-03-24 3:55 ` Optimizing union.scm Mark H Weaver
2014-03-24 13:45 ` Ludovic Courtès
2014-03-25 7:04 ` Mark H Weaver
2014-03-25 17:18 ` Ludovic Courtès
2014-03-25 22:30 ` Mark H Weaver
2014-03-25 22:58 ` Ludovic Courtès [this message]
2014-03-27 7:09 ` Mark H Weaver
2014-03-27 9:57 ` Ludovic Courtès
2014-04-02 14:14 ` Optimizing ‘guix package’ Ludovic Courtès
2014-04-02 16:58 ` Mark H Weaver
2014-03-26 23:29 ` Problems with handicapped 'bash' from glibc package 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://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y4zx3mxz.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=guix-devel@gnu.org \
--cc=mhw@netris.org \
/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.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
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).