From: lloda <lloda@sarc.name>
To: Christopher Lam <christopher.lck@gmail.com>
Cc: guile-user <guile-user@gnu.org>
Subject: Re: vector-last / vector-ref with negative indices?
Date: Sun, 20 Dec 2020 11:41:23 +0100 [thread overview]
Message-ID: <AF0AE894-5953-40BE-8CD1-89B1108CDE5D@sarc.name> (raw)
In-Reply-To: <CAKVAZZKc55X+H0FVqmPnexMSAvFsYLeSgYwA5QZ997BSwkkNkA@mail.gmail.com>
Besides the standard which applies to vector- operations, negative indices wouldn't work for Guile arrays to count from the end since negative indices, like in say Fortran, can be valid [e.g. (make-array 0 '(-1 4))]. In older versions of Guile you could use vector-ref on such arrays.
I don't think allowing negative indices is worthwhile for all the complications it introduces. But I don't like negative indices to count from the end either. Most of the time vectors aren't meant to have that wraparound property so it can turn a obvious error into an obscure one.
The solution I like best is to have a keyword that means 'the end', like in Octave, that can be used generically. Barring that you can easily define vector-last or even something like vector-ref-from-end I guess. I think it's weird that srfi-43 doesn't have vector-last, when srfi-1 has last. Maybe Guile could add that as an extension, although I don't like srfi-43 in general (I think the map functions are wrongly designed).
regards
Daniel
> On 20 Dec 2020, at 11:05, Christopher Lam <christopher.lck@gmail.com> wrote:
>
> Easy - vector-ref with a negative index is not defined in r[5|7]rs.
>
> On Sun, 20 Dec 2020 at 06:59, Aleix Conchillo Flaqué <aconchillo@gmail.com>
> wrote:
>
>> Hi,
>>
>> This month I'm trying to go through Advent Of Code one more year
>> (previous years I didn't get too far) and I've been finding myself
>> writing the same patterns multiple times that could be avoided by just
>> having a helper function.
>>
>> One of them is getting the last element of a vector. It is a quite
>> common operation when solving these types of problems. For example
>> Python as you might know uses negative indices.
>>
>> I have looked around and haven't seen it (unless I completely missed
>> it which would be shameful) but wouldn't it be good to have this
>> built-in by default?
>>
>> Instead of having to write:
>>
>> (vector-ref v (- (vector-length v) 1))
>>
>> you would write:
>>
>> (vector-last v) or even better (vector-ref v -1).
>>
>> Interestingly Racket doesn't offer those functions either as far as I can
>> tell.
>>
>> Basic use case? Get the maximum element of a sorted vector which would
>> be done in constant time.
>>
>> I'm trying to solve the problems idiomatically, to the best of my
>> limited knowledge, with Scheme. It is possible that the times I'm
>> using vectors I should think about it differently and not use them,
>> but I'm not 100% sure.
>>
>> What am I missing?
>>
>> Thank you in advance,
>>
>> Aleix
>>
>>
next prev parent reply other threads:[~2020-12-20 10:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-20 6:58 vector-last / vector-ref with negative indices? Aleix Conchillo Flaqué
2020-12-20 10:05 ` Christopher Lam
2020-12-20 10:41 ` lloda [this message]
2020-12-21 9:50 ` Aleix Conchillo Flaqué
-- strict thread matches above, loose matches on Subject: below --
2020-12-20 13:44 dsmich
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=AF0AE894-5953-40BE-8CD1-89B1108CDE5D@sarc.name \
--to=lloda@sarc.name \
--cc=christopher.lck@gmail.com \
--cc=guile-user@gnu.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.
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).