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....@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é <aconchi...@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 >> >>