txlyre 6 days ago
parent
commit
9bdbf9c96f
3 changed files with 26 additions and 10 deletions
  1. 2 1
      help.h
  2. 22 8
      jk.c
  3. 2 1
      readme.md

+ 2 - 1
help.h

@@ -133,6 +133,7 @@ const char *V2HELP =\
 "s. dyadic  selfref2      dyadic reference to current function or rhs of bind" "\n"\
 "F. monadic read          read file (x=0 to read stdin)" "\n"\
 "F. dyadic  write         write file (y=0 to write to stderr)" "\n"\
+"t. dyadic  cast          cast y to type x" "\n"\
 "t. monadic type          type of x, array=0, verb=1, symbol=2, number=3, char=4, nil=5, udf=6" "\n"\
 "r. monadic deal          yield random elt of x" "\n"\
 "r. dyadic  roll          roll xdy (note: y is 0-based, so >xr.y for 1-based)" "\n"\
@@ -167,7 +168,7 @@ const char *AHELP =\
 "xf\\.       eachleft      1-\\.1 2 3 yields 0 -1 -2" "\n"\
 "f\":        rank          #\":1 2 3$1 yields 3 3, #\":inf 2 3$1 yields 1 1 1,:1 1 1" "\n"\
 "xf\":       rank2         1 2 3 *:\":1 1 2 3 yields (,1),:2 2,:3 3 3" "\n"\
-"n`         amend         'gw'0 3`'cross' yields 'grows'" "\n"\
+"n`         amend         'gw'0 3`'cross' yields 'grows', 1 0 -1(1+)`!.5 yields 2 3 3 4 6" "\n"\
 "f&.        filter        >;0&.-2!.2 yields 1 2, basically shortcut for ]#.f" "\n"\
 "f/:        span          =;' '/:'x y z' yields (,'x'),:(,'y'),:(,'z')" "\n"\
 "xf/:       stencil       3+//:!10 yields 3 6 9 12 15 18 21 24, shortcut for f\"x|:" "\n"\

+ 22 - 8
jk.c

@@ -6043,23 +6043,37 @@ value_t *_adverb_amend_dyad(interpreter_t *state, verb_t *self, value_t *x,
     x = verb_enlist(state, NULL, x);
 
   value_t *v = self->bonds->data[0];
-  if (v->tag != ARRAY)
+  if (v->tag != ARRAY && v->tag != VERB)
     v = verb_enlist(state, NULL, v);
 
   if (y->tag != ARRAY)
     y = verb_enlist(state, NULL, y);
 
   list_t *r = list_copy(y->val.array);
-
   size_t l = x->val.array->length;
 
-  list_t *t = v->val.array;
-  for (size_t i = 0; i < t->length; i++) {
-    value_t *n = t->data[i];
-    if (n->tag != NUMBER)
-      break;
+  if (v->tag == VERB) {
+    list_t *t = x->val.array;
+    for (size_t i = 0; i < t->length; i++) {
+      value_t *n = t->data[i];
+      if (n->tag != NUMBER)
+        break;
 
-    list_set(r, n->val.number, list_index(x->val.array, i < l ? i : l - 1));
+      value_t *e = list_index(r, n->val.number);
+      if (!e)
+        continue;
+
+      list_set(r, n->val.number, apply_monad(state, v, e));
+    }
+  } else {
+    list_t *t = v->val.array;
+    for (size_t i = 0; i < t->length; i++) {
+      value_t *n = t->data[i];
+      if (n->tag != NUMBER)
+        break;
+
+      list_set(r, n->val.number, list_index(x->val.array, i < l ? i : l - 1));
+    }
   }
 
   return value_new_array(r);

+ 2 - 1
readme.md

@@ -292,6 +292,7 @@ s. monadic selfref1      monadic reference to current function or rhs of bind or
 s. dyadic  selfref2      dyadic reference to current function or rhs of bind or top-most train
 F. monadic read          read file (x=0 to read stdin)
 F. dyadic  write         write file (y=0 to write to stderr)
+t. dyadic  cast          cast y to type x
 t. monadic type          type of x, array=0, verb=1, symbol=2, number=3, char=4, nil=5, udf=6
 r. monadic deal          yield random elt of x
 r. dyadic  roll          roll xdy (note: y is 0-based, so >xr.y for 1-based)
@@ -323,7 +324,7 @@ xf/.       eachright     1-/.1 2 3 yields 0 1 2
 xf\.       eachleft      1-\.1 2 3 yields 0 -1 -2
 f":        rank          #":1 2 3$1 yields 3 3, #":inf 2 3$1 yields 1 1 1,:1 1 1
 xf":       rank2         1 2 3 *:":1 1 2 3 yields (,1),:2 2,:3 3 3
-n`         amend         'gw'0 3`'cross' yields 'grows'
+n`         amend         'gw'0 3`'cross' yields 'grows', 1 0 -1(1+)`!.5 yields 2 3 3 4 6
 f&.        filter        >;0&.-2!.2 yields 1 2, basically shortcut for ]#.f
 f/:        span          =;' '/:'x y z' yields (,'x'),:(,'y'),:(,'z')
 xf/:       stencil       3+//:!10 yields 3 6 9 12 15 18 21 24, shortcut for f"x|: