view cg.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500 (2013-11-25)
parents
children
line wrap: on
line source
/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Conjunctions: Gerunds ` and `:                                          */

#include "j.h"


A jtfxeachv(J jt,I r,A w){A*wv,x,z,*zv;I n,wd;
 RZ(w);
 n=AN(w); wv=AAV(w); wd=(I)w*ARELATIVE(w);
 ASSERT(r>=AR(w),EVRANK);
 ASSERT(n,EVLENGTH);
 ASSERT(BOX&AT(w),EVDOMAIN);
 GA(z,BOX,n,AR(w),AS(w)); zv=AAV(z);
 DO(n, RZ(zv[i]=x=fx(WVR(i))); ASSERT(VERB&AT(x),EVDOMAIN););
 R z;
}

F1(jtfxeach){R every(w,0L,jtfx);}

static DF1(jtcon1){A h,*hv,*x,z;V*sv;
 PREF1(jtcon1);
 sv=VAV(self); h=sv->h; hv=AAV(h);
 GA(z,BOX,AN(h),AR(h),AS(h)); x=AAV(z);
 DO(AN(h), RZ(*x++=CALL1(VAV(*hv)->f1,  w,*hv)); ++hv;);
 R ope(z);
}

static DF2(jtcon2){A h,*hv,*x,z;V*sv;
 PREF2(jtcon2);
 sv=VAV(self); h=sv->h; hv=AAV(h);
 GA(z,BOX,AN(h),AR(h),AS(h)); x=AAV(z);
 DO(AN(h), RZ(*x++=CALL2(VAV(*hv)->f2,a,w,*hv)); ++hv;);
 R ope(z);
}

static DF1(jtinsert){A f,hs,*hv,z;AF*hf;I j,k,m,n,old;
 RZ(w);
 n=IC(w); j=n-1; hs=VAV(self)->h; m=AN(hs); hv=AAV(hs);
 if(!n)R df1(w,iden(*hv));
 GA(f,INT,m,1,0); hf=(AF*)AV(f); DO(m, hf[i]=VAV(hv[i])->f2;);
 RZ(z=from(num[-1],w));
 old=jt->tbase+jt->ttop;
 DO(n-1, k=--j%m; RZ(z=CALL2(hf[k],from(sc(j),w),z,hv[k])); gc(z,old);)
 R z;
}

F2(jtevger){A hs;I k;
 RZ(a&&w);
 RE(k=i0(w)); 
 if(k==GTRAIN)R exg(a);
 RZ(hs=fxeachv(RMAX,a));
 switch(k){
  case GAPPEND:
   R fdef(CGRCO,VERB, jtcon1,jtcon2, a,w,hs, VGERL, RMAX,RMAX,RMAX);
  case GINSERT:
   ASSERT(1>=AR(a),EVRANK);
   R fdef(CGRCO,VERB, jtinsert,0L,   a,w,hs, VGERL, RMAX,0L,0L);
  default:
   ASSERT(0,EVDOMAIN);
}}

F2(jttie){RZ(a&&w); R over(VERB&AT(a)?arep(a):a,VERB&AT(w)?arep(w):w);}


static B jtatomic(J jt,C m,A w){A f,g;B ax,ay,vf,vg;C c,id;V*v;
 static C atomic12[]={CMIN, CLE, CMAX, CGE, CPLUS, CPLUSCO, CSTAR, CSTARCO, CMINUS, CDIV, CROOT, 
     CEXP, CLOG, CSTILE, CBANG, CLEFT, CRIGHT, CJDOT, CCIRCLE, CRDOT, CHGEOM, CFCONS, 0};
 static C atomic1[]={CNOT, CHALVE, 0};
 static C atomic2[]={CEQ, CLT, CGT, CPLUSDOT, CSTARDOT, CNE, 0};
 RZ(w&&VERB&AT(w));
 v=VAV(w); id=v->id;
 if(strchr(atomic12,id)||strchr(1==m?atomic1:atomic2,id))R 1;
 f=v->f; vf=f&&VERB&AT(f); ax=f&&NOUN&AT(f)&&!AR(f);
 g=v->g; vg=g&&VERB&AT(g); ay=g&&NOUN&AT(g)&&!AR(g);
 switch(id){
  case CAT:
  case CATCO:  R atomic(1,f)&&atomic(m,g);
  case CUNDER:
  case CUNDCO: R atomic(m,f)&&atomic(1,g);
  case CAMPCO: R atomic(m,f)&&atomic(1,g);
  case CQQ:    R ax||atomic(m,f);
  case CFORK:  R (CCAP==ID(f)?atomic(1,g):atomic(m,f)&&atomic(2,g))&&atomic(m,v->h);
  case CHOOK:  R atomic(2,f)&&atomic(1,g);
  case CTILDE: R NAME&AT(f)?atomic(m,fix(f)):atomic(2,f);
  case CFIT:   R atomic(m,f);
  case CAMP:   
   if(vf&&vg)R atomic(m,f)&&atomic(1,g);
   if(ax&&atomic(2,g)||ay&&atomic(2,f))R 1;
   if(vg&&1==AR(f)){c=ID(g); R c==CPOLY||c==CBASE;}
 }
 R 0;
}    /* 1 iff verb w is atomic; 1=m monad 2=m dyad */

static A jtgjoin(J jt,C c,A a,A w){A f;
 RZ(a&&w);
 ASSERT(1>=AR(a)&&1>=AR(w),EVRANK);
 ASSERT((!AN(a)||BOX&AT(a))&&(!AN(w)||BOX&AT(w)),EVDOMAIN);
 RZ(f=qq(atop(ds(CBOX),ds(CCOMMA)),zero));
 R df2(box(spellout(c)),df2(a,w,f),f);
}

static DF1(jtcase1a){A g,h,*hv,k,t,u,w0=w,x,y,*yv,z;B b;I r,*xv;V*sv;
 RZ(w);
 r=AR(w);
 if(1<r)RZ(w=gah(1L,w));
 sv=VAV(self); g=sv->g;
 if(atomic(1,g))RZ(k=df1(w,g))
 else{RZ(k=df1(w,qq(g,zero))); ASSERT(AR(k)==AR(w)&&AN(k)==AN(w),EVRANK);}
 if(B01&AT(k)){
  h=sv->h; ASSERT(2<=AN(h),EVINDEX); hv=AAV(h);
  RZ(x=df1(t=repeat(not(k),w),hv[0])); if(!AR(x))RZ(x=reshape(tally(t),x));
  RZ(y=df1(t=repeat(k,     w),hv[1])); if(!AR(y))RZ(y=reshape(tally(t),y));
  RZ(z=!AN(x)?y:!AN(y)?x:from(grade1(grade1(k)),over(x,y)));
 }else{
  RZ(u=nub(k));
  RZ(y=df2(k,w,sldot(gjoin(CATCO,box(scc(CBOX)),from(u,sv->f))))); yv=AAV(y);
  b=0; DO(AN(y), if(b=!AR(yv[i]))break;);
  if(b){
   RZ(x=df2(k,w,sldot(ds(CPOUND)))); xv=AV(x);
   DO(AN(y), if(!AR(yv[i]))RZ(yv[i]=reshape(sc(xv[i]),yv[i])););
  }
  RZ(z=from(grade1(grade1(k)),raze(grade2(y,u))));
 }
 if(1<r){RZ(z=gah(r,z)); ICPY(AS(z),AS(w0),r);}
 R z;
}

static DF1(jtcase1b){A h,u;V*sv;
 sv=VAV(self); h=sv->h;
 RZ(u=from(df1(w,sv->g),h));
 ASSERT(!AR(u),EVRANK);
 R df1(w,*AAV(u));
}

static DF1(jtcase1){A h,*hv;B b;I r,wr;V*sv;
 RZ(w);
 sv=VAV(self);
 wr=AR(w); r=jt->rank?jt->rank[1]:wr; r=MIN(r,sv->mr); jt->rank=0;
 if(b=!r&&wr&&AN(w)){h=sv->h; hv=AAV(h); DO(AN(h), if(!atomic(1,hv[i])){b=0; break;});}
 R b?case1a(w,self):rank1ex(w,self,r,jtcase1b);
}

static DF2(jtcase2){A u;V*sv;
 PREF2(jtcase2);
 sv=VAV(self);
 RZ(u=from(df2(a,w,sv->g),sv->h));
 ASSERT(!AR(u),EVRANK);
 R df2(a,w,*AAV(u));
}

static F2(jtgerfrom){A*av,*v,z;I ad,n;
 RZ(a&&w);  /* 1==AR(w)&&BOX&AT(w) */
 ASSERT(1>=AR(a),EVRANK);
 if(NUMERIC&AT(a))R from(a,w);
 else{
  ASSERT(BOX&AT(a),EVDOMAIN);
  n=AN(a); av=AAV(a); ad=(I)a*ARELATIVE(a);
  GA(z,BOX,n,1,0); v=AAV(z);
  DO(n, RZ(*v++=gerfrom(AVR(i),w)););
  R z;
}}

F2(jtagenda){
 RZ(a&&w)
 if(NOUN&AT(w))R exg(gerfrom(w,a));
 R fdef(CATDOT,VERB, jtcase1,jtcase2, a,w,fxeachv(1L,a), VGERL, mr(w),lr(w),rr(w));
}


static DF1(jtgcl1){DECLFG;A ff,*hv=AAV(sv->h);I d;
 d=fdep(hv[1]); FDEPINC(d); ff=df2(df1(w,hv[1]),gs,ds(sv->id)); FDEPDEC(d);
 R df1(df1(w,hv[2]),ff);
}

static DF1(jtgcr1){DECLFG;A ff,*hv=AAV(sv->h);I d; 
 d=fdep(hv[1]); FDEPINC(d); ff=df2(fs,df1(w,hv[1]),ds(sv->id)); FDEPDEC(d);
 R df1(df1(w,hv[2]),ff);
}

static DF2(jtgcl2){DECLFG;A ff,*hv=AAV(sv->h);I d; 
 d=fdep(hv[1]); FDEPINC(d); ff=df2(df2(a,w,hv[1]),gs,ds(sv->id)); FDEPDEC(d);
 R df2(df2(a,w,hv[0]),df2(a,w,hv[2]),ff);
}

static DF2(jtgcr2){DECLFG;A ff,*hv=AAV(sv->h);I d; 
 d=fdep(hv[1]); FDEPINC(d); ff=df2(fs,df2(a,w,hv[1]),ds(sv->id)); FDEPDEC(d);
 R df2(df2(a,w,hv[0]),df2(a,w,hv[2]),ff);
}

A jtgconj(J jt,A a,A w,C id){A hs,y;B na;I n;
 RZ(a&&w);
 ASSERT(VERB&AT(a)&&BOX&AT(w)||BOX&AT(a)&&VERB&AT(w),EVDOMAIN);
 na=1&&BOX&AT(a); y=na?a:w; n=AN(y);
 ASSERT(1>=AR(y),EVRANK);
 ASSERT(2==n||3==n,EVLENGTH);
 ASSERT(BOX&AT(y),EVDOMAIN);
 RZ(hs=fxeach(3==n?y:link(scc(CLEFT),y)));
 R fdef(id,VERB, na?jtgcl1:jtgcr1,na?jtgcl2:jtgcr2, a,w,hs, na?VGERL:VGERR, RMAX,RMAX,RMAX);
}

static DF1(jtgav1){DECLF;A ff,*hv=AAV(sv->h);I d;
 d=fdep(hv[1]); FDEPINC(d); ff=df1(df1(w,hv[1]),ds(sv->id)); FDEPDEC(d);
 R df1(df1(w,hv[2]),ff);
}

static DF2(jtgav2){DECLF;A ff,*hv=AAV(sv->h);I d;
 d=fdep(hv[1]); FDEPINC(d); ff=df1(df2(a,w,hv[1]),ds(sv->id)); FDEPDEC(d);
 R df2(df2(a,w,hv[0]),df2(a,w,hv[2]),ff);
}

A jtgadv(J jt,A w,C id){A hs;I n;
 RZ(w);
 ASSERT(BOX&AT(w),EVDOMAIN);
 n=AN(w);
 ASSERT(1>=AR(w),EVRANK);
 ASSERT(n&&n<=3,EVLENGTH);
 ASSERT(BOX&AT(w),EVDOMAIN);
 RZ(hs=fxeach(3==n?w:behead(reshape(num[4],w))));
 R fdef(id,VERB, jtgav1,jtgav2, w,0L,hs, VGERL, RMAX,RMAX,RMAX);
}


static DF1(jtgf1){A h=VAV(self)->h; R df1(  w,*AAV(h));}
static DF2(jtgf2){A h=VAV(self)->h; R df2(a,w,*AAV(h));}

A jtvger2(J jt,C id,A a,A w){A h,*hv,x;V*v;
 RZ(x=a?a:w);
 ASSERT(2==AN(x),EVLENGTH);
 RZ(h=fxeachv(1L,x)); hv=AAV(h); v=VAV(*hv);
 R fdef(id,VERB, jtgf1,jtgf2, x,a?w:0L, h, VGERL, (I)v->mr,(I)v->lr,(I)v->rr);
}    /* verify and define 2-element gerund */