Browse Source

optimize; fix trailing strand segfault

txlyre 3 months ago
parent
commit
742c019186
1 changed files with 36 additions and 20 deletions
  1. 36 20
      jk.c

+ 36 - 20
jk.c

@@ -638,10 +638,10 @@ Vt*Swalk(St*st,Nt*node){if(!node)R st->nil;
     vt*g=_g->val.verb;
     vt*h=_h->val.verb;
     vt*nv=vnew();
-    nv->bonds=An();
-    Ap(nv->bonds,f);
-    Ap(nv->bonds,g);
-    Ap(nv->bonds,h);
+    nv->bonds=Ank(3);
+    nv->bonds->data[0]=f;
+    nv->bonds->data[1]=g;
+    nv->bonds->data[2]=h;
     Z l=strlen(f->name)+strlen(g->name)+strlen(h->name)+1;
     nv->name=ma(l);
     snprintf(nv->name,l,"%s%s%s",f->name,g->name,h->name);
@@ -657,9 +657,9 @@ Vt*Swalk(St*st,Nt*node){if(!node)R st->nil;
     vt*f=_f->val.verb;
     vt*g=_g->val.verb;
     vt*nv=vnew();
-    nv->bonds=An();
-    Ap(nv->bonds,f);
-    Ap(nv->bonds,g);
+    nv->bonds=Ank(2);
+    nv->bonds->data[0]=f;
+    nv->bonds->data[1]=g;
     Z l=strlen(f->name)+strlen(g->name)+1;
     nv->name=ma(l);
     snprintf(nv->name,l,"%s%s",f->name,g->name);
@@ -673,9 +673,9 @@ Vt*Swalk(St*st,Nt*node){if(!node)R st->nil;
     Vt*g=Swalk(st,node->b);
     vt*f=_f->val.verb;
     vt*nv=vnew();
-    nv->bonds=An();
-    Ap(nv->bonds,f);
-    Ap(nv->bonds,g);
+    nv->bonds=Ank(2);
+    nv->bonds->data[0]=f;
+    nv->bonds->data[1]=g;
     S r=Vshow(g);
     Z l=strlen(r)+strlen(f->name)+1;
     nv->name=ma(l);
@@ -694,10 +694,10 @@ Vt*Swalk(St*st,Nt*node){if(!node)R st->nil;
     vt*g=_g->val.verb;
     vt*h=_h->val.verb;
     vt*nv=vnew();
-    nv->bonds=An();
-    Ap(nv->bonds,f);
-    Ap(nv->bonds,g);
-    Ap(nv->bonds,h);
+    nv->bonds=Ank(3);
+    nv->bonds->data[0]=f;
+    nv->bonds->data[1]=g;
+    nv->bonds->data[2]=h;
     S r=Vshow(f);
     Z l=strlen(r)+strlen(g->name)+strlen(h->name)+1;
     nv->name=ma(l);
@@ -1069,11 +1069,26 @@ Vt*vnudge_right(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)R venlist(st,N,x);
   for(Z i=0;i<yal-1;i++)Ap(r,yad[i]);R Vna(r);}
 Vt*venlist(St*st,vt*self,Vt*x){Ar*l=An();
   Ap(l,x);R Vna(l);}
-Vt*vjoin(St*st,vt*self,Vt*x,Vt*y){Ar*l=An();
-  if(xt==ARRAY&&xad)for(Z i=0;i<xal;i++)Ap(l,xad[i]);
-  else Ap(l,x);
-  if(yt==ARRAY&&yad)for(Z i=0;i<yal;i++)Ap(l,yad[i]);
-  else Ap(l,y);R Vna(l);}
+Vt*venpair(St*st,vt*self,Vt*x,Vt*y);
+Vt*vjoin(St*st,vt*self,Vt*x,Vt*y){Ar*l;
+  if(xt==ARRAY&&yt==ARRAY){if(!xad&&!yad)R st->unit;
+    elif(!xad)R y;
+    elif(!yad)R x;
+    l=Ank(xal+yal);
+    Z lp=0;
+    for(Z i=0;i<xal;i++)l->data[lp++]=xad[i];
+    for(Z i=0;i<yal;i++)l->data[lp++]=yad[i];}
+  elif(xt==ARRAY&&yt!=ARRAY){if(!xad)R venlist(st,N,y);
+    l=Ank(xal+1);
+    Z lp=0;
+    for(Z i=0;i<xal;i++)l->data[lp++]=xad[i];
+    l->data[lp++]=y;}
+  elif(xt!=ARRAY&&yt==ARRAY){if(!yad)R venlist(st,N,x);
+    l=Ank(yal+1);
+    Z lp=0;
+    l->data[lp++]=x;
+    for(Z i=0;i<yal;i++)l->data[lp++]=yad[i];}
+  else R venpair(st,N,x,y);R Vna(l);}
 Vt*venpair(St*st,vt*self,Vt*x,Vt*y){Ar*l=Ank(2);
   l->data[0]=x;
   l->data[1]=y;R Vna(l);}
@@ -2100,7 +2115,8 @@ Nt*PPnoun(Pt*parser,B flat){Nt*a=flat?PPatom(parser):_PPnoun(parser);
   if((tok=Plook(parser,0))&&tok->tag==T_PUNCT&&strcmp(tok->text,",:")==0){Peat(parser);
     Ar*l=An();
     Ap(l,a);
-    LOOP{a=flat?PPatom(parser):_PPnoun(parser);
+    LOOP{if(Pstop(parser))Perror(parser,"trailing-strand");
+      a=flat?PPatom(parser):_PPnoun(parser);
       Ap(l,a);
       if(!((tok=Plook(parser,0))&&tok->tag==T_PUNCT&&strcmp(tok->text,",:")==0))BR;
       Peat(parser);}