[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Scheme-reports] Legacy caar to cddddr

On Tue, Oct 25, 2011 at 1:03 AM, Andre van Tonder <andre@x> wrote:
> On Mon, 24 Oct 2011, Alex Shinn wrote:
>> I'd be interested to see real-world examples of (set-car! (c[ad]{3,}r x)
>> y).
>> My guess is these are examples of abusing lists as records.
> Whether to call this an abuse is very subjective, depending very much on the
> type system you are imposing in your mind on your Scheme program.

Types are one concern, time and space efficiency another.
Once you get past three fields vectors are smaller, and should
be faster in any optimizing compiler.

> As for which composite selectors should be provided by default, I agree with
> yout that one can probably suppress some of the selectors deeper than the
> spine of the list.  But maybe one could expand the number of selectors along
> the spine itself.  I have often run into the following:
>    (define binding-type           car)
>    (define binding-name           cadr)
>    (define binding-levels         caddr)
>    (define binding-mutable?       cadddr)
>    (define (binding-dimension b)  (car (cddddr b))) ; UGLY
> The last line is not a tragedy, but it is ugly.  Also, some optimizing
> implementations might be able to provide random access to more than 4
> initial elements of short lists.

SRFI-1 already extends the spine to `tenth', though
you may choose to rename the binding on import.
However, whatever depth you have, somewhere you'll
always have that ugly case unless you use more
general accessors like list-ref.

But more importantly, those definitions should only
ever occur once so the actual implementation is
abstract and the ugliness is minimized.


Scheme-reports mailing list