|
|
@@ -5513,25 +5513,14 @@ value_t *verb_lines(interpreter_t *state, verb_t *self, value_t *x) {
|
|
|
return value_new_array(r);
|
|
|
}
|
|
|
|
|
|
-value_t *verb_delete(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
- value_t *y) {
|
|
|
- if (x->tag != NUMBER)
|
|
|
- return state->udf;
|
|
|
-
|
|
|
- if (y->tag != ARRAY)
|
|
|
- y = verb_enlist(state, NULL, y);
|
|
|
- else if (!y->val.array->data)
|
|
|
- return y;
|
|
|
-
|
|
|
- size_t z = y->val.array->length;
|
|
|
-
|
|
|
- ssize_t index = trunc(x->val.number);
|
|
|
-
|
|
|
+list_t *list_delete(list_t *l, ssize_t index) {
|
|
|
+ size_t z = l->length;
|
|
|
+
|
|
|
if (index < 0)
|
|
|
index += ((ssize_t)z);
|
|
|
|
|
|
if (index < 0 || index >= z)
|
|
|
- return y;
|
|
|
+ return l;
|
|
|
|
|
|
list_t *r = list_newk(z - 1);
|
|
|
size_t ri = 0;
|
|
|
@@ -5540,41 +5529,35 @@ value_t *verb_delete(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
if (i == index)
|
|
|
continue;
|
|
|
else
|
|
|
- r->data[ri++] = y->val.array->data[i];
|
|
|
-
|
|
|
- return value_new_array(r);
|
|
|
+ r->data[ri++] = l->data[i];
|
|
|
+
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
-value_t *verb_deleteInplace(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
- value_t *y) {
|
|
|
+value_t *verb_delete(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
+ value_t *y) {
|
|
|
if (x->tag != NUMBER)
|
|
|
return state->udf;
|
|
|
|
|
|
if (y->tag != ARRAY)
|
|
|
- return state->udf;
|
|
|
+ y = verb_enlist(state, NULL, y);
|
|
|
else if (!y->val.array->data)
|
|
|
return y;
|
|
|
|
|
|
- size_t z = y->val.array->length;
|
|
|
-
|
|
|
- ssize_t index = trunc(x->val.number);
|
|
|
+ return value_new_array(list_delete(y->val.array, trunc(x->val.number)));
|
|
|
+}
|
|
|
|
|
|
- if (index < 0)
|
|
|
- index += ((ssize_t)z);
|
|
|
+value_t *verb_deleteInplace(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
+ value_t *y) {
|
|
|
+ if (x->tag != NUMBER)
|
|
|
+ return state->udf;
|
|
|
|
|
|
- if (index < 0 || index >= z)
|
|
|
+ if (y->tag != ARRAY)
|
|
|
+ return state->udf;
|
|
|
+ else if (!y->val.array->data)
|
|
|
return y;
|
|
|
|
|
|
- list_t *r = list_newk(z - 1);
|
|
|
- size_t ri = 0;
|
|
|
-
|
|
|
- for (size_t i = 0; i < z; i++)
|
|
|
- if (i == index)
|
|
|
- continue;
|
|
|
- else
|
|
|
- r->data[ri++] = y->val.array->data[i];
|
|
|
-
|
|
|
- y->val.array = r;
|
|
|
+ y->val.array = list_delete(y->val.array, trunc(x->val.number));
|
|
|
|
|
|
return y;
|
|
|
}
|