unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
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
>> 
>> 




  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).