summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/content/3.manual/manual.yml9
-rw-r--r--jv_aux.c5
-rw-r--r--tests/all.test4
3 files changed, 17 insertions, 1 deletions
diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml
index 973e8d85..ac0e70e0 100644
--- a/docs/content/3.manual/manual.yml
+++ b/docs/content/3.manual/manual.yml
@@ -256,6 +256,11 @@ sections:
the array), or omitted (in which case it refers to the start
or end of the array).
+ The `.[2]` syntax can be used to return the element at the
+ given index. Negative indices are allowed, with -1 referring
+ to the last element, -2 referring to the next to last element,
+ and so on.
+
The `?` "operator" can also be used with the slice operator,
as in `.[10:15]?`, which outputs values where the inputs are
slice-able.
@@ -285,6 +290,10 @@ sections:
input: '["a","b","c","d","e"]'
output: ['["d", "e"]']
+ - program: '.[-2]'
+ input: '[1,2,3]'
+ output: ['2']
+
- title: "`.[]`"
body: |
diff --git a/jv_aux.c b/jv_aux.c
index 5f233e05..dec5ce20 100644
--- a/jv_aux.c
+++ b/jv_aux.c
@@ -57,7 +57,10 @@ jv jv_get(jv t, jv k) {
}
} else if (jv_get_kind(t) == JV_KIND_ARRAY && jv_get_kind(k) == JV_KIND_NUMBER) {
if(jv_is_integer(k)){
- v = jv_array_get(t, (int)jv_number_value(k));
+ int idx = (int)jv_number_value(k);
+ if (idx < 0)
+ idx += jv_array_length(jv_copy(t));
+ v = jv_array_get(t, idx);
if (!jv_is_valid(v)) {
jv_free(v);
v = jv_null();
diff --git a/tests/all.test b/tests/all.test
index 4bd15cee..1fdb10a0 100644
--- a/tests/all.test
+++ b/tests/all.test
@@ -202,6 +202,10 @@ null
2
3
+.[-2]
+[1,2,3]
+2
+
[range(0;10)]
null
[0,1,2,3,4,5,6,7,8,9]