txlyre 2 дней назад
Родитель
Сommit
0ea8c8c911
2 измененных файлов с 37 добавлено и 0 удалено
  1. 2 0
      help.h
  2. 35 0
      jk.c

+ 2 - 0
help.h

@@ -126,6 +126,7 @@ const char *VHELP =\
 
 
 const char *V2HELP =\
 const char *V2HELP =\
 "d. dyadic  delete        delete elt from y by index x" "\n"\
 "d. dyadic  delete        delete elt from y by index x" "\n"\
+"D. dyadic  deleteInplace delete elt from y by index x (in-place)" "\n"\
 "p. monadic print         print x" "\n"\
 "p. monadic print         print x" "\n"\
 "P. monadic println       print x and a \\n" "\n"\
 "P. monadic println       print x and a \\n" "\n"\
 "c. monadic putch         print char x" "\n"\
 "c. monadic putch         print char x" "\n"\
@@ -199,6 +200,7 @@ const char *SHELP =\
 "/ comment" "\n"\
 "/ comment" "\n"\
 "5+5 / also comment" "\n"\
 "5+5 / also comment" "\n"\
 "5+5/not comment (no whitespace before /)" "\n"\
 "5+5/not comment (no whitespace before /)" "\n"\
+"abc foo bar f g x y z     / symbols" "\n"\
 "nil udf                   / special, nil and undefined" "\n"\
 "nil udf                   / special, nil and undefined" "\n"\
 "'a'%2                     / = nan, nan used to denote illegal numeric operation" "\n"\
 "'a'%2                     / = nan, nan used to denote illegal numeric operation" "\n"\
 "+1 2 3                    / = udf, attempt to transpose flat vector, udf/undefined used to denote illegal operation" "\n"\
 "+1 2 3                    / = udf, attempt to transpose flat vector, udf/undefined used to denote illegal operation" "\n"\

+ 35 - 0
jk.c

@@ -5545,6 +5545,40 @@ value_t *verb_delete(interpreter_t *state, verb_t *self, value_t *x,
   return value_new_array(r);
   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 *verb_rematch(interpreter_t *state, verb_t *self, value_t *x,
                       value_t *y) {
                       value_t *y) {
   char *pat = value_str(x);
   char *pat = value_str(x);
@@ -5730,6 +5764,7 @@ verb_t VERBS[] = {DEFVERB(":", 0, 0, 0, const, bind),
                   DEFVERBC("$", X, 0, 0, eye, implode),
                   DEFVERBC("$", X, 0, 0, eye, implode),
 
 
                   DEFVERBD("d", 0, X, 0, udf1, delete),
                   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, print, udf2),
                   DEFVERBD("P", 0, 0, 0, println, udf2),
                   DEFVERBD("P", 0, 0, 0, println, udf2),
                   DEFVERBD("c", X, 0, 0, putch, udf2),
                   DEFVERBD("c", X, 0, 0, putch, udf2),