|
|
@@ -5545,6 +5545,40 @@ value_t *verb_delete(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
return value_new_array(r);
|
|
|
}
|
|
|
|
|
|
+value_t *verb_deleteInplace(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;
|
|
|
+ else if (!y->val.array->data)
|
|
|
+ return y;
|
|
|
+
|
|
|
+ size_t z = y->val.array->length;
|
|
|
+
|
|
|
+ ssize_t index = trunc(x->val.number);
|
|
|
+
|
|
|
+ if (index < 0)
|
|
|
+ index += ((ssize_t)z);
|
|
|
+
|
|
|
+ if (index < 0 || index >= z)
|
|
|
+ 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;
|
|
|
+
|
|
|
+ return y;
|
|
|
+}
|
|
|
+
|
|
|
value_t *verb_rematch(interpreter_t *state, verb_t *self, value_t *x,
|
|
|
value_t *y) {
|
|
|
char *pat = value_str(x);
|
|
|
@@ -5730,6 +5764,7 @@ verb_t VERBS[] = {DEFVERB(":", 0, 0, 0, const, bind),
|
|
|
DEFVERBC("$", X, 0, 0, eye, implode),
|
|
|
|
|
|
DEFVERBD("d", 0, X, 0, udf1, delete),
|
|
|
+ DEFVERBD("D", 0, X, 0, udf1, deleteInplace),
|
|
|
DEFVERBD("p", 0, 0, 0, print, udf2),
|
|
|
DEFVERBD("P", 0, 0, 0, println, udf2),
|
|
|
DEFVERBD("c", X, 0, 0, putch, udf2),
|