jk.c 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541
  1. /* jk intepreter, by @txlyre,www:txlyre.website, in the public domain */
  2. #include<ctype.h>
  3. #include<limits.h>
  4. #include<math.h>
  5. #include<setjmp.h>
  6. #include<stdbool.h>
  7. #include<stdint.h>
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. #include<string.h>
  11. #include<time.h>
  12. #include<unistd.h>
  13. #include<sys/wait.h>
  14. #include<errno.h>
  15. #include<gc.h>
  16. #define VER "0.1alep"
  17. #define R return
  18. #define BR break
  19. #define CN continue
  20. #define WH while
  21. #define SW switch
  22. #define CS case
  23. #define T true
  24. #define F false
  25. #define N NULL
  26. #define LOOP for(;;)
  27. #define elif else if
  28. #define FR(p) GC_FREE(p)
  29. #define xt ((x)->tag)
  30. #define yt ((y)->tag)
  31. #define xa ((x)->val.array)
  32. #define ya ((y)->val.array)
  33. #define xad ((x)->val.array->data)
  34. #define yad ((y)->val.array->data)
  35. #define xal ((x)->val.array->length)
  36. #define yal ((y)->val.array->length)
  37. #define xn ((x)->val.number)
  38. #define yn ((y)->val.number)
  39. #define vn ((v)->val.number)
  40. #define xV ((x)->val.verb)
  41. #define yV ((y)->val.verb)
  42. #define xY ((x)->val.symbol)
  43. #define yY ((y)->val.symbol)
  44. #define Vnc(c) (CHARS[(unsigned char)(c)])
  45. typedef uint32_t U32;
  46. typedef uint64_t U64;
  47. typedef double D;
  48. typedef unsigned char UC;
  49. typedef char C;
  50. typedef char *S;
  51. typedef ssize_t SZ;
  52. typedef size_t Z;
  53. typedef bool B;
  54. typedef unsigned int UI;
  55. typedef int I;
  56. typedef void *P;
  57. typedef void V;
  58. typedef const char *cS;
  59. typedef const void *cP;
  60. #define SO(t) (sizeof(t))
  61. #define AE(x)(SO(x)/SO((x)[0]))
  62. #define ROTL32(x, r) ((x << r) | (x >> (32 - r)))
  63. #define FMIX32(h) \
  64. h ^= h >> 16; \
  65. h *= 0x85ebca6b; \
  66. h ^= h >> 13; \
  67. h *= 0xc2b2ae35; \
  68. h ^= h >> 16;
  69. #define TABLE_MIN_SIZE 32
  70. #define CV(s) (Srun(st,s)->val.verb)
  71. jmp_buf Icp;
  72. B Iin;
  73. P ma(Z size){P p;
  74. if(!(p=GC_MALLOC(size)))abort();R p;}
  75. P maa(Z size){P p;
  76. if(!(p=GC_malloc_atomic(size)))abort();
  77. memset(p,0,size);R p;}
  78. P mau(Z size){P p;
  79. if(!(p=GC_malloc_uncollectable(size)))abort();
  80. memset(p,0,size);R p;}
  81. P mrea(P p,Z size){if(!(p=GC_REALLOC(p,size)))abort();R p;}
  82. S sdup(S s){S p=GC_strdup(s);
  83. if(!p)abort();R p;}
  84. typedef struct{P*data;
  85. Z length;}Ar;
  86. Ar*An(void){Ar*arr=ma(SO(Ar));
  87. arr->data=N;
  88. arr->length=0;R arr;}
  89. Ar*Ank(Z k){Ar*arr=ma(SO(Ar));
  90. arr->data=ma(k*SO(P ));
  91. arr->length=k;R arr;}
  92. Ar*Ac(Ar*l){Ar*arr=Ank(l->length);
  93. for(Z i=0;i<l->length;i++)arr->data[i]=l->data[i];R arr;}
  94. V Ap(Ar*l,P v){Z i=l->length++;
  95. l->data=mrea(l->data,l->length*SO(P ));
  96. l->data[i]=v;}
  97. P AP(Ar*l){if(!l->data)R N;
  98. Z i=--l->length;
  99. P v=l->data[i];
  100. l->data[i]=N;
  101. if(!l->length){FR(l->data);
  102. l->data=N;}else l->data=mrea(l->data,l->length*SO(P ));R v;}
  103. P Ai(Ar*l,SZ index){if(!l->data)R N;
  104. if(index<0)index+=((SZ)l->length);
  105. if(index<0||index>=l->length)R N;R l->data[index];}
  106. V As(Ar*l,SZ index,P v){if(!l->data)R;
  107. if(index<0)index+=((SZ)l->length);
  108. if(index<0||index>=l->length)R;
  109. l->data[index]=v;}
  110. typedef struct{S str;
  111. Z used;
  112. Z allocated;}Bt;
  113. Bt*Bnew(void){Bt*buf=ma(SO(Bt));
  114. buf->str=N;
  115. buf->used=buf->allocated=0;R buf;}
  116. V Bappend(Bt*buf,C c){buf->used++;
  117. if(buf->used>buf->allocated){buf->allocated++;
  118. buf->str=mrea(buf->str,SO(char)*buf->allocated);}
  119. buf->str[buf->used-1]=c;}
  120. S Bread(Bt*buf){if(buf->used==0||buf->str[buf->used-1])Bappend(buf,0);
  121. S str=buf->str;
  122. FR(buf);R str;}
  123. V BappendS(Bt*buf,S s){WH(*s)Bappend(buf,*s++);}
  124. typedef struct{enum Tkt{T_PUNCT,T_LPAR,T_RPAR,T_NAME,T_NUM,T_QUOTE}tag;
  125. S text;}Tkt;
  126. typedef struct{S source;
  127. Z len;
  128. Z pos;
  129. Ar*tokens;}Lt;
  130. Lt*Lnew(void){Lt*lexer=ma(SO(Lt));R lexer;}
  131. C Llook(Lt*lexer,Z offset){Z pos=lexer->pos+offset;
  132. if(pos>=lexer->len)R 0;R lexer->source[pos];}
  133. C Leat(Lt*lexer){if(lexer->pos>=lexer->len)R 0;R lexer->source[lexer->pos++];}
  134. V LpT(Lt*lexer,enum Tkt tag,S text){Tkt*token=ma(SO(Tkt));
  135. token->tag=tag;
  136. token->text=text;
  137. Ap(lexer->tokens,token);}
  138. Ar*guards;
  139. jmp_buf*guard(){jmp_buf*lb=maa(SO(jmp_buf));
  140. Ap(guards,lb);R lb;}
  141. jmp_buf*guarding(){R Ai(guards,-1);}
  142. V unguard(){jmp_buf*lb=AP(guards);
  143. FR(lb);}
  144. V fatal(S s){jmp_buf*lb;
  145. if((lb=guarding()))longjmp(*lb,1);
  146. fprintf(stderr,"|%s error\n",s);
  147. if(Iin)longjmp(Icp,1);
  148. exit(1);}
  149. V Lerror(Lt*lexer,S s){fatal(s);}
  150. V Llnum(Lt*lexer,B is_negative){Bt*buf=Bnew();
  151. if(is_negative)Bappend(buf,'-');
  152. if(Llook(lexer,0)=='.'){Bappend(buf,Leat(lexer));
  153. if(!(isdigit(Llook(lexer,0))))Lerror(lexer,"trailing-dot");}
  154. do{Bappend(buf,Leat(lexer));
  155. if(Llook(lexer,0)=='`'&&isdigit(Llook(lexer,1)))Leat(lexer);}WH(isdigit(Llook(lexer,0)));
  156. if(Llook(lexer,0)=='.'){Bappend(buf,Leat(lexer));
  157. if(!(isdigit(Llook(lexer,0))))Lerror(lexer,"trailing-dot");
  158. do{Bappend(buf,Leat(lexer));}WH(isdigit(Llook(lexer,0)));}
  159. LpT(lexer,T_NUM,Bread(buf));}
  160. V Llex(Lt*lexer,S s){lexer->source=s;
  161. lexer->len=strlen(s);
  162. lexer->pos=0;
  163. lexer->tokens=An();
  164. WH(lexer->pos<lexer->len){C c=Llook(lexer,0);
  165. if(c=='/'&&!lexer->tokens->data)BR;
  166. if(isspace(c)){Leat(lexer);
  167. if(Llook(lexer,0)=='/')BR;}elif(isdigit(c)||c=='.'){Llnum(lexer,F);}elif(isalpha(c)){Bt*buf=Bnew();
  168. do{Bappend(buf,Leat(lexer));}WH(isalpha(Llook(lexer,0)));
  169. if(buf->used==1&&Llook(lexer,0)=='.'){Bappend(buf,Leat(lexer));
  170. LpT(lexer,T_PUNCT,Bread(buf));}else LpT(lexer,T_NAME,Bread(buf));}elif(c=='('||c==')'){Leat(lexer);
  171. LpT(lexer,c=='('?T_LPAR:T_RPAR,N);}elif(c=='\''){Bt*buf=Bnew();
  172. Leat(lexer);
  173. LOOP{if(lexer->pos>=lexer->len)Lerror(lexer,"unmatched-quote");
  174. if(Llook(lexer,0)=='\''){if(Llook(lexer,1)=='\''){Bappend(buf,Leat(lexer));
  175. Leat(lexer);CN;}
  176. Leat(lexer);BR;}
  177. Bappend(buf,Leat(lexer));}
  178. LpT(lexer,T_QUOTE,Bread(buf));}elif(ispunct(c)){C buf[3];
  179. buf[0]=Leat(lexer);
  180. buf[1]=0;
  181. if(Llook(lexer,0)=='.'||Llook(lexer,0)==':'){buf[1]=Leat(lexer);
  182. buf[2]=0;}
  183. if(strcmp(buf,"-")==0&&isdigit(Llook(lexer,0))){Llnum(lexer,T);CN;}
  184. LpT(lexer,T_PUNCT,sdup(buf));}else Lerror(lexer,"lex");}}
  185. typedef struct _Tt Tt;
  186. typedef struct _Tentry_t Tentry_t;
  187. struct _Tentry_t{S key;
  188. P value;
  189. B is_deleted;};
  190. struct _Tt{Tentry_t*entries;
  191. Z used;
  192. Z capacity;};
  193. Tt*Tnew(void){Tt*table=ma(SO(Tt));
  194. table->used=0;
  195. table->capacity=TABLE_MIN_SIZE;
  196. table->entries=ma(table->capacity*SO(Tentry_t));R table;}
  197. Z Tlength(Tt*table){R table->used;}
  198. B Tempty(Tt*table){R table->used==0;}
  199. static U64 MM86128(P key,const I len,U32 seed){const uint8_t*data=(const uint8_t*)key;
  200. const I nblocks=len/16;
  201. U32 h1=seed;
  202. U32 h2=seed;
  203. U32 h3=seed;
  204. U32 h4=seed;
  205. U32 c1=0x239b961b;
  206. U32 c2=0xab0e9789;
  207. U32 c3=0x38b34ae5;
  208. U32 c4=0xa1e38b93;
  209. const uint32_t*blocks=(const uint32_t*)(data+nblocks*16);
  210. for(I i=-nblocks;i;i++){U32 k1=blocks[i*4+0];
  211. U32 k2=blocks[i*4+1];
  212. U32 k3=blocks[i*4+2];
  213. U32 k4=blocks[i*4+3];
  214. k1*=c1;
  215. k1=ROTL32(k1,15);
  216. k1*=c2;
  217. h1^=k1;
  218. h1=ROTL32(h1,19);
  219. h1+=h2;
  220. h1=h1*5+0x561ccd1b;
  221. k2*=c2;
  222. k2=ROTL32(k2,16);
  223. k2*=c3;
  224. h2^=k2;
  225. h2=ROTL32(h2,17);
  226. h2+=h3;
  227. h2=h2*5+0x0bcaa747;
  228. k3*=c3;
  229. k3=ROTL32(k3,17);
  230. k3*=c4;
  231. h3^=k3;
  232. h3=ROTL32(h3,15);
  233. h3+=h4;
  234. h3=h3*5+0x96cd1c35;
  235. k4*=c4;
  236. k4=ROTL32(k4,18);
  237. k4*=c1;
  238. h4^=k4;
  239. h4=ROTL32(h4,13);
  240. h4+=h1;
  241. h4=h4*5+0x32ac3b17;}
  242. const uint8_t*tail=(const uint8_t*)(data+nblocks*16);
  243. U32 k1=0;
  244. U32 k2=0;
  245. U32 k3=0;
  246. U32 k4=0;
  247. SW(len & 15){CS 15:k4^=tail[14]<<16;
  248. CS 14:k4^=tail[13]<<8;
  249. CS 13:k4^=tail[12]<<0;
  250. k4*=c4;
  251. k4=ROTL32(k4,18);
  252. k4*=c1;
  253. h4^=k4;
  254. CS 12:k3^=tail[11]<<24;
  255. CS 11:k3^=tail[10]<<16;
  256. CS 10:k3^=tail[9]<<8;
  257. CS 9:k3^=tail[8]<<0;
  258. k3*=c3;
  259. k3=ROTL32(k3,17);
  260. k3*=c4;
  261. h3^=k3;
  262. CS 8:k2^=tail[7]<<24;
  263. CS 7:k2^=tail[6]<<16;
  264. CS 6:k2^=tail[5]<<8;
  265. CS 5:k2^=tail[4]<<0;
  266. k2*=c2;
  267. k2=ROTL32(k2,16);
  268. k2*=c3;
  269. h2^=k2;
  270. CS 4:k1^=tail[3]<<24;
  271. CS 3:k1^=tail[2]<<16;
  272. CS 2:k1^=tail[1]<<8;
  273. CS 1:k1^=tail[0]<<0;
  274. k1*=c1;
  275. k1=ROTL32(k1,15);
  276. k1*=c2;
  277. h1^=k1;}
  278. h1^=len;
  279. h2^=len;
  280. h3^=len;
  281. h4^=len;
  282. h1+=h2;
  283. h1+=h3;
  284. h1+=h4;
  285. h2+=h1;
  286. h3+=h1;
  287. h4+=h1;
  288. FMIX32(h1);
  289. FMIX32(h2);
  290. FMIX32(h3);
  291. FMIX32(h4);
  292. h1+=h2;
  293. h1+=h3;
  294. h1+=h4;
  295. h2+=h1;
  296. h3+=h1;
  297. h4+=h1;R(((U64)h2)<<32)| h1;}
  298. static U32 HASH_SEED=0;
  299. P Tget(Tt*table,S key){if(Tempty(table))R N;
  300. U64 hash=MM86128(key,strlen(key),HASH_SEED);
  301. Z index=hash%table->capacity;
  302. Z i=index;
  303. WH(table->entries[i].key){if(!table->entries[i].is_deleted&&strcmp(table->entries[i].key,key)==0)R table->entries[i].value;
  304. i++;
  305. if(i>=table->capacity)i=0;
  306. if(i==index)BR;}
  307. R N;}
  308. B Thas(Tt*table,S key){if(Tempty(table))R F;
  309. U64 hash=MM86128(key,strlen(key),HASH_SEED);
  310. Z index=hash%table->capacity;
  311. Z i=index;
  312. WH(table->entries[i].key){if(!table->entries[i].is_deleted&&strcmp(table->entries[i].key,key)==0)R T;
  313. i++;
  314. if(i>=table->capacity)i=0;
  315. if(i==index)BR;}
  316. R F;}
  317. static V Tentry_set(Tentry_t*entries,S key,P value,Z capacity,Z*used){U64 hash=MM86128(key,strlen(key),HASH_SEED);
  318. Z index=hash%capacity;
  319. Z i=index;
  320. WH(entries[i].key){if(strcmp(entries[i].key,key)==0){entries[i].value=value;
  321. if(entries[i].is_deleted){if(used)(*used)++;
  322. entries[i].is_deleted=F;}
  323. R;}elif(entries[i].is_deleted)BR;
  324. i++;
  325. if(i>=capacity)i=0;
  326. if(i==index)BR;}
  327. if(used)(*used)++;
  328. entries[i].key=key;
  329. entries[i].value=value;
  330. entries[i].is_deleted=F;}
  331. Tt*Tset(Tt*table,S key,P value){if(table->used>=table->capacity){Z capacity=table->capacity+TABLE_MIN_SIZE;
  332. Tentry_t*entries=ma(capacity*SO(Tentry_t));
  333. for(Z i=0;i<table->capacity;i++){Tentry_t entry=table->entries[i];
  334. if(entry.key&&!entry.is_deleted)Tentry_set(entries,entry.key,entry.value,capacity,N);}
  335. FR(table->entries);
  336. table->entries=entries;
  337. table->capacity=capacity;}
  338. Tentry_set(table->entries,key,value,table->capacity,&table->used);R table;}
  339. B Tdelete(Tt*table,S key){U64 hash=MM86128(key,strlen(key),HASH_SEED);
  340. Z index=hash%table->capacity;
  341. Z i=index;
  342. WH(table->entries[i].key){if(!table->entries[i].is_deleted&&strcmp(table->entries[i].key,key)==0){table->entries[i].value=N;
  343. table->entries[i].is_deleted=T;
  344. table->used--;
  345. if(table->capacity>TABLE_MIN_SIZE&&table->used<=table->capacity-TABLE_MIN_SIZE){Z capacity=table->capacity-TABLE_MIN_SIZE;
  346. Tentry_t*entries=ma(capacity*SO(Tentry_t));
  347. for(Z i=0;i<table->capacity;i++){Tentry_t entry=table->entries[i];
  348. if(entry.key&&!entry.is_deleted)Tentry_set(entries,entry.key,entry.value,capacity,N);}
  349. FR(table->entries);
  350. table->entries=entries;
  351. table->capacity=capacity;}
  352. R T;}
  353. i++;
  354. if(i>=table->capacity)i=0;
  355. if(i==index)BR;}
  356. R F;}
  357. typedef struct _Vt Vt;
  358. typedef struct _St St;
  359. typedef struct _vt vt;
  360. struct _St{Tt*env;
  361. Ar*args;
  362. Ar*selfrefs;
  363. Vt*nil;
  364. Vt*udf;
  365. Vt*unit;
  366. vt*at;};
  367. struct _vt{S name;
  368. UI rank[3];
  369. Ar*bonds;
  370. B mark;
  371. B is_fun;
  372. Vt*(*monad)(St*,vt*,Vt*);
  373. Vt*(*dyad)(St*,vt*,Vt*,Vt*);};
  374. typedef struct{S name;
  375. vt*(*adverb)(St*,Vt*);
  376. vt*(*conjunction)(St*,Vt*,Vt*);}advt;
  377. struct _Vt{enum Vtag_t{ARRAY,VERB,SYM,NUM,CHAR,NIL,UDF}tag;
  378. union{Ar*array;
  379. vt*verb;
  380. S symbol;
  381. D number;
  382. UC _char;}val;};
  383. vt*vnew(){vt*verb=ma(SO(vt));R verb;}
  384. Vt*Vnew(enum Vtag_t tag){Vt*val;
  385. if(tag>SYM)val=maa(SO(Vt));
  386. else val=ma(SO(Vt));
  387. val->tag=tag;R val;}
  388. Vt*VnC(enum Vtag_t tag){Vt*val=mau(SO(Vt));
  389. val->tag=tag;R val;}
  390. Vt*_UNIT;
  391. Vt*Vna(Ar*array){if(!array->data){FR(array);R _UNIT;}
  392. Vt*val=Vnew(ARRAY);
  393. val->val.array=array;R val;}
  394. Tt*VCACHE;
  395. Vt*Vnv(vt*verb){Vt*val;
  396. if((val=Tget(VCACHE,verb->name)))R val;
  397. val=Vnew(VERB);
  398. val->val.verb=verb;R val;}
  399. Tt*SCACHE;
  400. Vt*Vny(S symbol){Vt*val;
  401. if((val=Tget(SCACHE,symbol)))R val;
  402. val=VnC(SYM);
  403. val->val.symbol=symbol;
  404. Tset(SCACHE,symbol,val);R val;}
  405. Vt*_NAN,*INF,*NINF;
  406. Vt*NNUMS[8];
  407. Vt*NUMS[256];
  408. Vt*CHARS[256];
  409. Vt*Vnn(D number){if(isnan(number))R _NAN;
  410. elif(number==INFINITY)R INF;
  411. elif(number==-INFINITY)R NINF;
  412. elif(number>=0&&number<256&&number==(D)((Z)number))R NUMS[(Z)number];
  413. elif(number<0&&number>=-8&&fabs(number)==(D)((Z)fabs(number)))R NNUMS[((Z)fabs(number))-1];
  414. Vt*val=Vnew(NUM);
  415. val->val.number=number;R val;}
  416. B Veq(Vt*x,Vt*y){if(xt!=yt)R F;
  417. SW(xt){CS ARRAY:{Ar*tx=xa;
  418. Ar*ty=ya;
  419. if(tx->length==0&&ty->length==0)BR;
  420. if(tx->length!=ty->length)R F;
  421. for(Z i=0;i<tx->length;i++)if(!Veq(tx->data[i],ty->data[i]))R F;}
  422. CS VERB:R strcmp(xV->name,xV->name)==0;
  423. CS SYM:R strcmp(xY,yY)==0;
  424. CS NUM:if(isnan(xn)&&isnan(yn))BR;R xn==yn;
  425. CS CHAR:R x==y;
  426. CS NIL:CS UDF:BR;}
  427. R T;}
  428. B Cap(Ar*a){for(Z i=0;i<a->length;i++){Vt*v=a->data[i];
  429. if(v->tag!=CHAR||!isprint(v->val._char))R F;}
  430. R T;}
  431. B Aap(Ar*a){for(Z i=0;i<a->length;i++){Vt*v=a->data[i];
  432. if(v->tag!=ARRAY)R F;}
  433. R T;}
  434. S Vshow(Vt*v);
  435. S show_array(Vt*v){if(v->tag!=ARRAY)R Vshow(v);
  436. Ar*t=v->val.array;
  437. if(!t->data)R sdup("()");
  438. Bt*buf=Bnew();
  439. if(t->length==1){Bappend(buf,',');
  440. S ts=Vshow(t->data[0]);
  441. BappendS(buf,ts);
  442. FR(ts);R Bread(buf);}
  443. if(Cap(t)){for(Z i=0;i<t->length;i++)Bappend(buf,((Vt*)t->data[i])->val._char);R Bread(buf);}
  444. if(!Aap(t))for(Z i=0;i<t->length;i++){S ts=Vshow(t->data[i]);
  445. BappendS(buf,ts);
  446. FR(ts);
  447. if(i!=t->length-1)Bappend(buf,' ');}
  448. else for(Z i=0;i<t->length;i++){S ts=show_array(t->data[i]);
  449. BappendS(buf,ts);
  450. FR(ts);
  451. if(i!=t->length-1)Bappend(buf,'\n');}
  452. R Bread(buf);}
  453. S Vshow(Vt*v){SW(v->tag){CS ARRAY:R show_array(v);
  454. CS VERB:R sdup(v->val.verb->name);
  455. CS SYM:R sdup(v->val.symbol);
  456. CS NUM:{C buf[128];
  457. snprintf(buf,SO(buf),"%.15g",vn);R sdup(buf);}
  458. CS CHAR:{if(!isprint(v->val._char)){C buf[16];
  459. snprintf(buf,SO(buf),"4t.%d",v->val._char);R sdup(buf);}
  460. C buf[2];
  461. buf[0]=v->val._char;
  462. buf[1]=0;R sdup(buf);}
  463. CS NIL:R sdup("nil");
  464. CS UDF:R sdup("udf");}
  465. R sdup("<?>");}
  466. D Vnum(Vt*v){if(v->tag==CHAR)R v->val._char;R vn;}
  467. B VTp(Vt*x){SW(xt){CS ARRAY:R xal!=0;
  468. CS NUM:CS CHAR:R Vnum(x)!=0;
  469. CS NIL:CS UDF:R F;
  470. default:R T;}}
  471. vt*Gv(S s);
  472. St*Sn(void){St*st=ma(SO(St));
  473. st->env=Tnew();
  474. st->args=An();
  475. st->selfrefs=An();
  476. st->nil=Vnew(NIL);
  477. st->udf=Vnew(UDF);
  478. st->unit=_UNIT;
  479. st->at=Gv("@");R st;}
  480. V Serror(St*st,S e){fprintf(stderr,"%s error\n",e);
  481. exit(1);}
  482. Vt*eR(St*st,vt*f,Vt*x,UI d,UI rm){if(!f->monad)R st->udf;
  483. if(d>=rm||xt!=ARRAY){if(f->mark)Ap(st->selfrefs,f);
  484. Vt*r=f->monad(st,f,x);
  485. if(f->mark)AP(st->selfrefs);R r;}
  486. Ar*t=xa;
  487. if(!t->data)R x;
  488. Ar*l=Ank(t->length);
  489. for(Z i=0;i<t->length;i++)l->data[i]=eR(st,f,t->data[i],d+1,rm);R Vna(l);}
  490. Vt*apM(St*st,Vt*f,Vt*x){if(f->tag!=VERB)R st->udf;
  491. if(!f->val.verb->monad)R st->udf;R eR(st,f->val.verb,x,0,f->val.verb->rank[0]);}
  492. Vt*tgth(St*st,vt*f,Vt*x,Vt*y,UI dl,UI dr,UI rl,UI rr){if(!f->dyad)R st->udf;
  493. if(dl>=rl&&dr>=rr){if(f->mark)Ap(st->selfrefs,f);
  494. Vt*r=f->dyad(st,f,x,y);
  495. if(f->mark)AP(st->selfrefs);R r;}
  496. if(dl<rl&&dr<rr&&xt==ARRAY&&yt==ARRAY){Ar*tx=xa;
  497. Ar*ty=ya;
  498. if(!tx->data||!ty->data)R !tx->data?x:y;
  499. Ar*t=Ank(ty->length<tx->length?ty->length:tx->length);
  500. for(Z i=0;i<tx->length;i++){if(i>=ty->length)BR;
  501. t->data[i]=tgth(st,f,tx->data[i],ty->data[i],dl+1,dr+1,rl,rr);}
  502. R Vna(t);}elif((xt!=ARRAY||dl>=rl)&&yt==ARRAY&&dr<rr){Ar*ty=ya;
  503. if(!ty->data)R y;
  504. Ar*t=Ank(ty->length);
  505. for(Z i=0;i<ty->length;i++)t->data[i]=tgth(st,f,x,ty->data[i],dl,dr+1,rl,rr);R Vna(t);}elif((yt!=ARRAY||dr>=rr)&&xt==ARRAY&&dl<rl){Ar*tx=xa;
  506. if(!tx->data)R x;
  507. Ar*t=Ank(tx->length);
  508. for(Z i=0;i<tx->length;i++)t->data[i]=tgth(st,f,tx->data[i],y,dl+1,dr,rl,rr);R Vna(t);}
  509. if(f->mark)Ap(st->selfrefs,f);
  510. Vt*r=f->dyad(st,f,x,y);
  511. if(f->mark)AP(st->selfrefs);R r;}
  512. Vt*apD(St*st,Vt*f,Vt*x,Vt*y){if(f->tag!=VERB)R st->nil;R tgth(st,f->val.verb,x,y,0,0,f->val.verb->rank[1],f->val.verb->rank[2]);}
  513. typedef struct _Nt Nt;
  514. struct _Nt{enum Ntag_t{N_STRAND,N_LITERAL,N_INDEX1,N_INDEX2,N_FUN,N_MONAD,N_DYAD,N_ADV,N_CONJ,N_PARTIAL_CONJ,N_FORK,N_HOOK,N_BOND,N_OVER,N_BIND}tag;
  515. advt*av;
  516. Vt*v;
  517. Ar*l;
  518. Nt*a;
  519. Nt*b;
  520. Nt*c;};
  521. Vt*_fork_m(St*st,vt*self,Vt*x){vt*f=Ai(self->bonds,0);
  522. vt*g=Ai(self->bonds,1);
  523. vt*h=Ai(self->bonds,2);
  524. Vt*l=eR(st,f,x,0,f->rank[0]);
  525. Vt*r=eR(st,h,x,0,f->rank[0]);R tgth(st,g,l,r,0,0,g->rank[1],g->rank[2]);}
  526. Vt*_fork_d(St*st,vt*self,Vt*x,Vt*y){vt*f=Ai(self->bonds,0);
  527. vt*g=Ai(self->bonds,1);
  528. vt*h=Ai(self->bonds,2);
  529. Vt*l=eR(st,f,x,0,f->rank[0]);
  530. Vt*r=eR(st,h,y,0,f->rank[0]);R tgth(st,g,l,r,0,0,g->rank[1],g->rank[2]);}
  531. Vt*_hook_m(St*st,vt*self,Vt*x){vt*f=Ai(self->bonds,0);
  532. vt*g=Ai(self->bonds,1);
  533. Vt*r=eR(st,g,x,0,g->rank[0]);R eR(st,f,r,0,f->rank[0]);}
  534. Vt*_hook_d(St*st,vt*self,Vt*x,Vt*y){vt*f=Ai(self->bonds,0);
  535. vt*g=Ai(self->bonds,1);
  536. Vt*r=tgth(st,g,x,y,0,0,g->rank[1],g->rank[2]);R eR(st,f,r,0,f->rank[0]);}
  537. Vt*_bond_m(St*st,vt*self,Vt*x){vt*f=Ai(self->bonds,0);
  538. Vt*g=Ai(self->bonds,1);R tgth(st,f,g,x,0,0,f->rank[1],f->rank[2]);}
  539. Vt*_bond_d(St*st,vt*self,Vt*x,Vt*y){vt*f=Ai(self->bonds,0);
  540. Vt*g=Ai(self->bonds,1);
  541. Vt*r=tgth(st,f,x,y,0,0,f->rank[1],f->rank[2]);R tgth(st,f,x,r,0,0,f->rank[1],f->rank[2]);}
  542. Vt*_over_m(St*st,vt*self,Vt*x){Vt*f=Ai(self->bonds,0);
  543. vt*g=Ai(self->bonds,1);
  544. vt*h=Ai(self->bonds,2);
  545. Vt*l=eR(st,h,x,0,h->rank[0]);R tgth(st,g,f,l,0,0,g->rank[1],g->rank[2]);}
  546. Vt*_over_d(St*st,vt*self,Vt*x,Vt*y){Vt*f=Ai(self->bonds,0);
  547. vt*g=Ai(self->bonds,1);
  548. vt*h=Ai(self->bonds,2);
  549. Vt*l=tgth(st,h,x,y,0,0,h->rank[1],h->rank[2]);R tgth(st,g,f,l,0,0,g->rank[1],g->rank[2]);}
  550. B nca(Nt*node,unsigned int*argc){if(!node)R F;
  551. if(node->tag==N_LITERAL&&node->v->tag==SYM&&strcmp(node->v->val.symbol,"y")==0){*argc=2;R T;}elif(node->tag==N_LITERAL&&node->v->tag==SYM&&strcmp(node->v->val.symbol,"x")==0){if(*argc<2)*argc=1;}elif(node->tag==N_MONAD||node->tag==N_CONJ||node->tag==N_HOOK||node->tag==N_BOND||node->tag==N_INDEX1){if(nca(node->a,argc))R T;
  552. if(nca(node->b,argc))R T;}elif(node->tag==N_DYAD||node->tag==N_FORK||node->tag==N_OVER||node->tag==N_INDEX2){if(nca(node->a,argc))R T;
  553. if(nca(node->b,argc))R T;
  554. if(nca(node->c,argc))R T;}elif(node->tag==N_ADV){if(nca(node->a,argc))R T;}elif(node->tag==N_STRAND){Ar*t=node->l;
  555. for(Z i=0;i<t->length;i++)if(nca(t->data[i],argc))R T;}
  556. R F;}
  557. Vt*Swalk(St*st,Nt*node);
  558. Vt*_const_m(St*st,vt*self,Vt*x){R self->bonds->data[0];}
  559. Vt*_const_d(St*st,vt*self,Vt*x,Vt*y){R self->bonds->data[0];}
  560. Vt*_fun_m(St*st,vt*self,Vt*x){Ar*args=An();
  561. Ap(args,x);
  562. Ap(args,self);
  563. Ap(st->args,args);
  564. Vt*r=Swalk(st,self->bonds->data[0]);
  565. AP(st->args);
  566. FR(args);R r;}
  567. Vt*_fun_d(St*st,vt*self,Vt*x,Vt*y){Ar*args=An();
  568. Ap(args,x);
  569. Ap(args,y);
  570. Ap(args,self);
  571. Ap(st->args,args);
  572. Vt*r=Swalk(st,self->bonds->data[1]);
  573. AP(st->args);
  574. FR(args);R r;}
  575. Vt*_partial_conjunction(St*st,vt*self,Vt*x){advt*av=self->bonds->data[0];
  576. Vt*a=self->bonds->data[1];R Vnv(av->conjunction(st,a,x));}
  577. Nt*Nn1(enum Ntag_t tag,Nt*a);
  578. Vt*Swalk(St*st,Nt*node){if(!node)R st->nil;
  579. SW(node->tag){CS N_STRAND:{Ar*t=node->l;
  580. for(Z i=0;i<t->length;i++)t->data[i]=Swalk(st,t->data[i]);R Vna(node->l);}
  581. CS N_LITERAL:{Vt*v=node->v;
  582. Vt*t=N;
  583. if(v->tag==SYM){S n=v->val.symbol;
  584. if(st->args->data){Ar*args=Ai(st->args,-1);
  585. Z argc=args->length-1;
  586. if(argc==2&&strcmp(n,"y")==0)R args->data[1];
  587. elif(strcmp(n,"x")==0)R args->data[0];}
  588. if((t=Tget(st->env,n)))R t;
  589. if(strcmp(n,"T")==0)R Vnn(time(N));}
  590. R v;}
  591. CS N_INDEX1:R tgth(st,st->at,Swalk(st,node->a),Swalk(st,node->b),0,0,st->at->rank[1],st->at->rank[2]);
  592. CS N_INDEX2:R tgth(st,st->at,tgth(st,st->at,Swalk(st,node->a),Swalk(st,node->b),0,0,st->at->rank[1],st->at->rank[2]),Swalk(st,node->c),0,0,st->at->rank[1],st->at->rank[2]);
  593. CS N_FUN:{UI argc=0;
  594. nca(node->a,&argc);
  595. vt*nv=vnew();
  596. if(argc>0)nv->is_fun=T;
  597. nv->bonds=An();
  598. nv->name=sdup(argc==0?":...":argc==1?":x":":xy");
  599. nv->rank[0]=0;
  600. nv->rank[1]=0;
  601. nv->rank[2]=0;
  602. if(argc==0){Ap(nv->bonds,Swalk(st,node->a));
  603. nv->monad=_const_m;
  604. nv->dyad=_const_d;}elif(argc==1){Ap(nv->bonds,node->a);
  605. nv->monad=_fun_m;
  606. nv->dyad=N;}else{nv->monad=N;
  607. Ap(nv->bonds,st->udf);
  608. Ap(nv->bonds,node->a);
  609. nv->dyad=_fun_d;}
  610. R Vnv(nv);}
  611. CS N_MONAD:R apM(st,Swalk(st,node->a),Swalk(st,node->b));
  612. CS N_DYAD:R apD(st,Swalk(st,node->a),Swalk(st,node->b),Swalk(st,node->c));
  613. CS N_ADV:{Vt*v=Swalk(st,node->a);R Vnv(node->av->adverb(st,v));}
  614. CS N_CONJ:{Vt*v1=Swalk(st,node->a);
  615. Vt*v2=Swalk(st,node->b);R Vnv(node->av->conjunction(st,v1,v2));}
  616. CS N_PARTIAL_CONJ:{vt*nv=vnew();
  617. Vt*a=Swalk(st,node->a);
  618. S r=Vshow(a);
  619. Z l=strlen(r)+strlen(node->av->name)+1;
  620. nv->name=ma(l);
  621. snprintf(nv->name,l,"%s%s",r,node->av->name);
  622. FR(r);
  623. nv->bonds=An();
  624. Ap(nv->bonds,node->av);
  625. Ap(nv->bonds,a);
  626. nv->rank[0]=0;
  627. nv->rank[1]=0;
  628. nv->rank[2]=0;
  629. nv->monad=_partial_conjunction;
  630. nv->dyad=N;R Vnv(nv);}
  631. CS N_FORK:{Vt*_f=Swalk(st,node->a);
  632. if(_f->tag!=VERB)R st->udf;
  633. Vt*_g=Swalk(st,node->b);
  634. if(_g->tag!=VERB)R st->udf;
  635. Vt*_h=Swalk(st,node->c);
  636. if(_h->tag!=VERB)R st->udf;
  637. vt*f=_f->val.verb;
  638. vt*g=_g->val.verb;
  639. vt*h=_h->val.verb;
  640. vt*nv=vnew();
  641. nv->bonds=Ank(3);
  642. nv->bonds->data[0]=f;
  643. nv->bonds->data[1]=g;
  644. nv->bonds->data[2]=h;
  645. Z l=strlen(f->name)+strlen(g->name)+strlen(h->name)+1;
  646. nv->name=ma(l);
  647. snprintf(nv->name,l,"%s%s%s",f->name,g->name,h->name);
  648. nv->rank[0]=0;
  649. nv->rank[1]=0;
  650. nv->rank[2]=0;
  651. nv->monad=_fork_m;
  652. nv->dyad=_fork_d;R Vnv(nv);}
  653. CS N_HOOK:{Vt*_f=Swalk(st,node->a);
  654. if(_f->tag!=VERB)R st->udf;
  655. Vt*_g=Swalk(st,node->b);
  656. if(_g->tag!=VERB)R st->udf;
  657. vt*f=_f->val.verb;
  658. vt*g=_g->val.verb;
  659. vt*nv=vnew();
  660. nv->bonds=Ank(2);
  661. nv->bonds->data[0]=f;
  662. nv->bonds->data[1]=g;
  663. Z l=strlen(f->name)+strlen(g->name)+1;
  664. nv->name=ma(l);
  665. snprintf(nv->name,l,"%s%s",f->name,g->name);
  666. nv->rank[0]=0;
  667. nv->rank[1]=0;
  668. nv->rank[2]=0;
  669. nv->monad=_hook_m;
  670. nv->dyad=_hook_d;R Vnv(nv);}
  671. CS N_BOND:{Vt*_f=Swalk(st,node->a);
  672. if(_f->tag!=VERB)R st->udf;
  673. Vt*g=Swalk(st,node->b);
  674. vt*f=_f->val.verb;
  675. vt*nv=vnew();
  676. nv->bonds=Ank(2);
  677. nv->bonds->data[0]=f;
  678. nv->bonds->data[1]=g;
  679. S r=Vshow(g);
  680. Z l=strlen(r)+strlen(f->name)+1;
  681. nv->name=ma(l);
  682. snprintf(nv->name,l,"%s%s",r,f->name);
  683. FR(r);
  684. nv->rank[0]=0;
  685. nv->rank[1]=0;
  686. nv->rank[2]=0;
  687. nv->monad=_bond_m;
  688. nv->dyad=_bond_d;R Vnv(nv);}
  689. CS N_OVER:{Vt*f=Swalk(st,node->a);
  690. Vt*_g=Swalk(st,node->b);
  691. if(_g->tag!=VERB)R st->udf;
  692. Vt*_h=Swalk(st,node->c);
  693. if(_h->tag!=VERB)R st->udf;
  694. vt*g=_g->val.verb;
  695. vt*h=_h->val.verb;
  696. vt*nv=vnew();
  697. nv->bonds=Ank(3);
  698. nv->bonds->data[0]=f;
  699. nv->bonds->data[1]=g;
  700. nv->bonds->data[2]=h;
  701. S r=Vshow(f);
  702. Z l=strlen(r)+strlen(g->name)+strlen(h->name)+1;
  703. nv->name=ma(l);
  704. snprintf(nv->name,l,"%s%s%s",r,g->name,h->name);
  705. FR(r);
  706. nv->rank[0]=0;
  707. nv->rank[1]=0;
  708. nv->rank[2]=0;
  709. nv->monad=_over_m;
  710. nv->dyad=_over_d;R Vnv(nv);}
  711. CS N_BIND:{Vt*l=node->a->v;
  712. Nt*b=node->b;
  713. UI argc=0;
  714. nca(b,&argc);
  715. if(argc!=0)b=Nn1(N_FUN,b);
  716. Vt*r=Swalk(st,b);
  717. if(r->tag==VERB&&argc==0)r->val.verb->mark=T;
  718. Vt*ov=Tget(st->env,l->val.symbol);
  719. if(ov&&ov->tag==VERB&&ov->val.verb->is_fun&&r->tag==VERB&&r->val.verb->is_fun){if(!ov->val.verb->monad&&r->val.verb->monad){As(ov->val.verb->bonds,0,r->val.verb->bonds->data[0]);
  720. ov->val.verb->monad=r->val.verb->monad;BR;}
  721. if(!ov->val.verb->dyad&&r->val.verb->dyad){Ap(ov->val.verb->bonds,r->val.verb->bonds->data[1]);
  722. ov->val.verb->dyad=r->val.verb->dyad;BR;}}
  723. Tset(st->env,l->val.symbol,r);}}
  724. R st->nil;}
  725. Vt*vconst(St*st,vt*self,Vt*x){vt*nv=vnew();
  726. nv->bonds=Ank(1);
  727. nv->bonds->data[0]=x;
  728. S r=Vshow(x);
  729. Z l=strlen(r)+2;
  730. nv->name=ma(l);
  731. snprintf(nv->name,l,":%s",r);
  732. nv->rank[0]=0;
  733. nv->rank[1]=0;
  734. nv->rank[2]=0;
  735. nv->monad=_const_m;
  736. nv->dyad=_const_d;R Vnv(nv);}
  737. Vt*vbind(St*st,vt*self,Vt*x,Vt*y){if(xt==SYM){if(yt==VERB)yV->mark=T;
  738. Tset(st->env,xY,y);}
  739. R st->udf;}
  740. Tt*Inverses;
  741. Vt*vunbind(St*st,vt*self,Vt*x){if(xt==SYM){Tdelete(st->env,xY);R st->nil;}
  742. R st->udf;}
  743. Vt*vobverse(St*st,vt*self,Vt*x,Vt*y){if(xt==VERB&&yt==VERB){vt*vx=xV;
  744. if(!yV->monad)
  745. R st->udf;
  746. if(strcmp(vx->name,":...")==0||strcmp(vx->name,":x")==0||strcmp(vx->name,":xy")==0)R st->udf;
  747. if(Thas(Inverses,vx->name))R st->udf;
  748. Tset(Inverses,vx->name,yV);R st->nil;}
  749. R st->udf;}
  750. Vt*vflip(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R st->udf;
  751. if(!Aap(xa))R st->udf;
  752. Ar*r=An();
  753. Vt*c0=xad[0];
  754. Ar*c0t=c0->val.array;
  755. Z c0l=c0t->length;
  756. for(Z i=0;i<c0l;i++){Ar*nc=An();
  757. for(Z j=0;j<xal;j++){Vt*rw=xad[j];
  758. Ar*rwt=rw->val.array;
  759. if(!rwt->data)R st->udf;
  760. Vt*v=Ai(rwt,i);
  761. if(!v)v=rwt->data[0];
  762. Ap(nc,v);}
  763. Ap(r,Vna(nc));}
  764. R Vna(r);}
  765. Vt*vplus(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(xt==CHAR||yt==CHAR)R Vnc(Vnum(x)+Vnum(y));R Vnn(Vnum(x)+Vnum(y));}
  766. R _NAN;}
  767. Vt*vsign(St*st,vt*self,Vt*x){if(xt==NUM)R xn<0?NNUMS[0]:xn>0?NUMS[1]:NUMS[0];R _NAN;}
  768. D gcd(D a,D b){if(b!=0)R gcd(b,fmod(a,b));
  769. else R fabs(a);}
  770. Vt*vgcd(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(gcd(xn,yn));R _NAN;}
  771. Vt*vsin(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(sin(xn));R _NAN;}
  772. Vt*vsquare(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(xn*xn);R _NAN;}
  773. Vt*vnegate(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(-xn);R _NAN;}
  774. Vt*vminus(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(xt==CHAR||yt==CHAR)R Vnc(Vnum(x)-Vnum(y));R Vnn(Vnum(x)-Vnum(y));}
  775. R _NAN;}
  776. Vt*vatan(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(atan(xn));R _NAN;}
  777. Vt*vatan2(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(atan2(xn,yn));R _NAN;}
  778. Vt*vfirst(St*st,vt*self,Vt*x){if(xt!=ARRAY)R x;
  779. if(!xad)R st->udf;R xad[0];}
  780. Vt*vtimes(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(xt==CHAR||yt==CHAR)R Vnc(Vnum(x)*Vnum(y));R Vnn(Vnum(x)*Vnum(y));}
  781. R _NAN;}
  782. D lcm(D a,D b){R(a*b)/gcd(a,b);}
  783. U64 factorial(U64 n){U64 r=1;
  784. WH(n>0)r*=n--;R r;}
  785. Vt*vfactorial(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(factorial((U64)fabs(xn)));R _NAN;}
  786. Vt*vlcm(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(lcm(xn,yn));R _NAN;}
  787. Vt*vdouble(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(xn*2);R _NAN;}
  788. Vt*vreplicate(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM){Z k=fabs(xn);
  789. Ar*r=An();
  790. WH(k--)Ap(r,y);R Vna(r);}
  791. R st->udf;}
  792. Vt*vreciprocal(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(1/xn);R _NAN;}
  793. Vt*vdivide(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM){D ny=yn;
  794. if(ny==0)R INF;R Vnn(xn/ny);}
  795. R _NAN;}
  796. D npower(D base,I n){if(n<0)R npower(1/base,-n);
  797. elif(n==0)R 1.0;
  798. elif(n==1)R base;
  799. elif(n%2)R base*npower(base*base,n/2);
  800. else R npower(base*base,n/2);}
  801. D nroot(D base,I n){if(n==1)R base;
  802. elif(n<=0||base<0)R NAN;
  803. else{D delta,x=base/n;
  804. do{delta=(base/npower(x,n-1)-x)/n;
  805. x+=delta;}WH(fabs(delta)>=1e-8);R x;}}
  806. Vt*vsqrt(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(sqrt(xn));R _NAN;}
  807. Vt*vroot(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(nroot(yn,xn));R _NAN;}
  808. Vt*vhalve(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(xn/2);R _NAN;}
  809. Vt*vidivide(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM){D ny=yn;
  810. if(ny==0)R INF;R Vnn(trunc(xn/ny));}
  811. R _NAN;}
  812. Vt*venlist(St*st,vt*self,Vt*x);
  813. Vt*vpred(St*st,vt*self,Vt*x);
  814. Vt*vrange(St*st,vt*self,Vt*x,Vt*y);
  815. Vt*venum(St*st,vt*self,Vt*x){if(Veq(x,NUMS[1]))R venlist(st,N,NUMS[0]);
  816. elif(Veq(x,NUMS[0]))R st->unit;R vrange(st,self,NUMS[0],vpred(st,self,x));}
  817. Vt*vmod(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM){D ny=yn;
  818. if(ny==0)R _NAN;R Vnn(fmod(xn,ny));}
  819. R _NAN;}
  820. Vt*vtake(St*st,vt*self,Vt*x,Vt*y);
  821. Vt*vdrop(St*st,vt*self,Vt*x,Vt*y);
  822. B spnp(D v){R isnan(v)||v==INFINITY||v==-INFINITY;}
  823. Vt*vodometer(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  824. elif(xal<2)R st->udf;
  825. Z p=1;
  826. Z xl=xal;
  827. for(Z i=0;i<xl;i++){Vt*it=xad[i];
  828. if(it->tag!=NUM||spnp(it->val.number))R st->udf;
  829. p*=(Z)(it->val.number);}
  830. if(p<1)R st->unit;
  831. uint64_t*lims=maa(SO(U64)*xl);
  832. for(Z i=0;i<xl;i++)lims[i]=(Z)(((Vt*)xad[i])->val.number);
  833. uint64_t**z=ma(SO(uint64_t*)*p);
  834. for(Z i=0;i<p;i++)z[i]=maa(SO(U64)*xl);
  835. for(Z i=0;i<p-1;i++){uint64_t*r=z[i];
  836. uint64_t*s=z[i+1];
  837. B carry=T;
  838. for(Z j=0;j<xl;j++){U64 a=xl-1-j;
  839. s[a]=r[a];
  840. if(carry){s[a]++;carry=F;}
  841. if(s[a]>=lims[a]){s[a]=0;carry=T;}}}
  842. FR(lims);
  843. Ar*r=Ank(p);
  844. for(Z i=0;i<p;i++){Ar*rw=Ank(xl);
  845. for(Z j=0;j<xl;j++)rw->data[j]=Vnn(z[i][j]);
  846. r->data[i]=Vna(rw);
  847. FR(z[i]);}
  848. FR(z);R Vna(r);}
  849. Vt*vchunks(St*st,vt*self,Vt*x,Vt*y){if(xt!=NUM)R st->udf;
  850. if(yt!=ARRAY)y=venlist(st,N,y);
  851. elif(!yad)R y;
  852. Ar*r=An();
  853. Z cl=fabs(xn);
  854. for(Z i=0;i<yal;i+=cl)Ap(r,vtake(st,N,Vnn(cl),vdrop(st,N,Vnn(i),y)));R Vna(r);}
  855. Vt*vexp(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(exp(xn));R _NAN;}
  856. Vt*vpower(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(pow(xn,yn));R _NAN;}
  857. Vt*vnlog(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(log(xn));R _NAN;}
  858. Vt*vlog(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(log(yn)/log(xn));R _NAN;}
  859. I bits_needed(U32 value){I bits=0;
  860. for(I bit_test=16;bit_test>0;bit_test>>=1){if(value>>bit_test!=0){bits+=bit_test;
  861. value>>=bit_test;}}
  862. R bits+value;}
  863. Vt*vbits(St*st,vt*self,Vt*x){if(xt==NUM){I n=xn;
  864. I bk=bits_needed(n);
  865. Ar*r=Ank(bk);
  866. for(I i=0;i<bk;i++)if((n &(1<<i))>>i)r->data[i]=NUMS[1];
  867. else r->data[i]=NUMS[0];R Vna(r);}
  868. R st->udf;}
  869. Vt*vreverse(St*st,vt*self,Vt*x);
  870. Vt*vbase(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM){Z v=fabs(yn);
  871. Z b=fabs(xn);
  872. if(b<2)R st->udf;
  873. Ar*r=An();
  874. WH(v>0){Ap(r,Vnn(v%b));
  875. v/=b;}
  876. R vreverse(st,N,Vna(r));}
  877. R st->udf;}
  878. SZ indexOf(Ar*l,Vt*x){if(!l->data)return-1;
  879. for(Z i=0;i<l->length;i++)if(Veq(l->data[i],x))R i;
  880. return-1;}
  881. Vt*vgroup(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  882. elif(!xad)R x;
  883. Ar*r=An();
  884. Ar*is=An();
  885. for(Z i=0;i<xal;i++){Vt*v=xad[i];
  886. SZ n=indexOf(is,v);
  887. if(n<0){Ap(r,venlist(st,N,Vnn(i)));
  888. Ap(is,v);}else{Vt*tmp=Ai(r,n);
  889. Ap(tmp->val.array,Vnn(i));}}
  890. FR(is->data);
  891. FR(is);R Vna(r);}
  892. Vt*vbuckets(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,N,x);
  893. elif(!xad)R y;
  894. if(yt!=ARRAY)y=venlist(st,N,x);
  895. elif(!yad)R y;
  896. Ar*r=An();
  897. Z mx=0;
  898. for(Z i=0;i<xal;i++){Vt*v=xad[i];
  899. if(v->tag!=NUM)BR;
  900. SZ j=vn;
  901. if(j>=0&&j>mx)mx=j;}
  902. for(Z i=0;i<mx+1;i++)Ap(r,An());
  903. if(!r->data){FR(r);R st->unit;}
  904. for(Z i=0;i<xal;i++){if(i>=yal)BR;
  905. Vt*v=xad[i];
  906. if(v->tag!=NUM)BR;
  907. SZ j=vn;
  908. if(j>=0){Ar*b=Ai(r,j);
  909. if(b)Ap(b,yad[i]);}}
  910. if(xal<yal){Ar*lb=An();
  911. for(Z i=xal;i<yal;i++)Ap(lb,yad[i]);
  912. Ap(r,lb);}
  913. for(Z i=0;i<r->length;i++)r->data[i]=Vna(r->data[i]);R Vna(r);}
  914. Vt*vequals(St*st,vt*self,Vt*x,Vt*y){R Veq(x,y)?NUMS[1]:NUMS[0];}
  915. Vt*vpermute(St*st,vt*self,Vt*x){if(xt!=ARRAY||xal<2)R x;
  916. Ar*permutation=Ac(xa);
  917. Z length=permutation->length;
  918. Ar*result=An();
  919. Ap(result,Ac(permutation));
  920. Ar*c=An();
  921. for(Z i=0;i<length;i++){Z*n=maa(SO(Z));
  922. Ap(c,n);}
  923. Z k;
  924. Ar*p;
  925. Z i=0;
  926. WH(i<length){Z*n=Ai(c,i);
  927. if((*n)<i){k=i%2&&(*n);
  928. p=Ai(permutation,i);
  929. As(permutation,i,Ai(permutation,k));
  930. As(permutation,k,p);
  931. *n=(*n)+1;
  932. i=1;
  933. Ap(result,Ac(permutation));}else{*n=0;
  934. i++;}}
  935. for(Z i=0;i<c->length;i++)FR(c->data[i]);
  936. FR(c->data);
  937. FR(c);
  938. FR(permutation->data);
  939. FR(permutation);
  940. for(Z i=0;i<result->length;i++)result->data[i]=Vna(result->data[i]);R Vna(result);}
  941. Vt*voccurences(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  942. elif(!xad)R x;
  943. Ar*table=An();
  944. Ar*r=An();
  945. for(Z i=0;i<xal;i++){B f=F;
  946. Vt*it=xad[i];
  947. for(Z j=0;j<table->length;j++){Ar*p=table->data[j];
  948. if(Veq(p->data[0],it)){Z*n=p->data[1];
  949. *n=(*n)+1;
  950. Ap(r,Vnn(*n));
  951. f=T;BR;}}
  952. if(!f){Ar*p=Ank(2);
  953. p->data[0]=it;
  954. Z*n=maa(SO(Z));
  955. p->data[1]=n;
  956. Ap(table,p);
  957. Ap(r,NUMS[0]);}}
  958. for(Z i=0;i<table->length;i++){Ar*p=table->data[i];
  959. FR(p->data[1]);
  960. FR(p->data);
  961. FR(p);}
  962. FR(table->data);
  963. FR(table);R Vna(r);}
  964. Vt*vmask(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,N,x);
  965. elif(!xad)R x;
  966. if(yt!=ARRAY)y=venlist(st,N,y);
  967. Ar*r=An();
  968. Vt*l=Vnn(yal);
  969. Z n=0;
  970. Z k=xal;
  971. for(Z i=0;i<k;i++){Vt*s=vtake(st,N,l,vdrop(st,N,Vnn(i),x));
  972. if(Veq(s,y)){n++;
  973. for(Z j=0;j<l->val.number;j++,i++)Ap(r,Vnn(n));
  974. i--;}else Ap(r,NUMS[0]);}
  975. R Vna(r);}
  976. Vt*vclassify(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  977. elif(!xad)R x;
  978. Ar*table=An();
  979. Ar*r=An();
  980. for(Z i=0;i<xal;i++){B f=F;
  981. Vt*it=xad[i];
  982. for(Z j=0;j<table->length;j++){Ar*p=table->data[j];
  983. if(Veq(p->data[0],it)){Z*n=p->data[1];
  984. Ap(r,Vnn(*n));
  985. f=T;BR;}}
  986. if(!f){Ar*p=Ank(2);
  987. p->data[0]=it;
  988. Z*n=maa(SO(Z));
  989. *n=i++;
  990. p->data[1]=n;
  991. Ap(table,p);
  992. Ap(r,Vnn(*n));}}
  993. for(Z i=0;i<table->length;i++){Ar*p=table->data[i];
  994. FR(p->data[1]);
  995. FR(p->data);
  996. FR(p);}
  997. FR(table->data);
  998. FR(table);R Vna(r);}
  999. Vt*vunbits(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  1000. I n=0;
  1001. for(Z i=0;i<xal;i++){if(VTp(xad[i]))n|=(int)1<<(int)i;
  1002. else n &=~((int)1<<(int)i);}
  1003. R Vnn(n);}
  1004. Vt*vunbase(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM){Z b=fabs(xn);
  1005. if(b<2)R st->udf;
  1006. if(yt!=ARRAY)y=venlist(st,N,y);
  1007. Z n=0;
  1008. if(!yad)R st->udf;
  1009. for(Z i=0;i<yal;i++){Vt*v=yad[i];
  1010. if(v->tag!=NUM)BR;
  1011. Z k=fabs(vn);
  1012. n=n*b+k;}
  1013. R Vnn(n);}
  1014. R st->udf;}
  1015. Vt*vnot(St*st,vt*self,Vt*x){R VTp(x)?NUMS[0]:NUMS[1];}
  1016. Vt*vnot_equals(St*st,vt*self,Vt*x,Vt*y){R !Veq(x,y)?NUMS[1]:NUMS[0];}
  1017. Vt*vpred(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(xn-1);
  1018. elif(xt==CHAR)R Vnc(x->val._char-1);R _NAN;}
  1019. Vt*vless(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)<Vnum(y))R NUMS[1];R NUMS[0];}
  1020. R _NAN;}
  1021. Vt*vfloor(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(floor(xn));R _NAN;}
  1022. I _compare_up(cP a,cP b){Vt*x=(*(Ar**)a)->data[0];
  1023. Vt*y=(*(Ar**)b)->data[0];
  1024. if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)>Vnum(y))R 1;
  1025. elif(Vnum(x)<Vnum(y))return-1;R 0;}
  1026. R 0;}
  1027. I _compare_down(cP a,cP b){Vt*x=(*(Ar**)a)->data[0];
  1028. Vt*y=(*(Ar**)b)->data[0];
  1029. if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)>Vnum(y))return-1;
  1030. elif(Vnum(x)<Vnum(y))R 1;R 0;}
  1031. R 0;}
  1032. Vt*_grade(Vt*x,B down){if(xt!=ARRAY||xal<2)R x;
  1033. Ar*ps=Ank(xal);
  1034. for(Z i=0;i<xal;i++){Ar*p=Ank(2);
  1035. p->data[0]=xad[i];
  1036. p->data[1]=Vnn(i);
  1037. ps->data[i]=p;}
  1038. qsort(ps->data,ps->length,SO(P ),down?_compare_down:_compare_up);
  1039. for(Z i=0;i<ps->length;i++){Ar*p=ps->data[i];
  1040. ps->data[i]=p->data[1];
  1041. FR(p->data);
  1042. FR(p);}
  1043. R Vna(ps);}
  1044. Vt*vgradedown(St*st,vt*self,Vt*x){R _grade(x,T);}
  1045. Vt*vnudge_left(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)R venlist(st,N,x);
  1046. elif(!yad)R y;
  1047. elif(yal<2)R venlist(st,N,x);
  1048. Ar*r=An();
  1049. for(Z i=1;i<yal;i++)Ap(r,yad[i]);
  1050. Ap(r,x);R Vna(r);}
  1051. Vt*vlesseq(St*st,vt*self,Vt*x,Vt*y){if(Veq(x,y))R NUMS[1];
  1052. if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)<Vnum(y))R NUMS[1];R NUMS[0];}
  1053. R _NAN;}
  1054. Vt*vsucc(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(xn+1);
  1055. elif(xt==CHAR)R Vnc(x->val._char+1);R _NAN;}
  1056. Vt*vceil(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(ceil(xn));R _NAN;}
  1057. Vt*vgreater(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)>Vnum(y))R NUMS[1];R NUMS[0];}
  1058. R _NAN;}
  1059. Vt*vgreatereq(St*st,vt*self,Vt*x,Vt*y){if(Veq(x,y))R NUMS[1];
  1060. if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)>Vnum(y))R NUMS[1];R NUMS[0];}
  1061. R _NAN;}
  1062. Vt*vgradeup(St*st,vt*self,Vt*x){R _grade(x,F);}
  1063. Vt*vnudge_right(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)R venlist(st,N,x);
  1064. elif(!yad)R y;
  1065. elif(yal<2)R venlist(st,N,x);
  1066. Ar*r=An();
  1067. Ap(r,x);
  1068. for(Z i=0;i<yal-1;i++)Ap(r,yad[i]);R Vna(r);}
  1069. Vt*venlist(St*st,vt*self,Vt*x){Ar*l=An();
  1070. Ap(l,x);R Vna(l);}
  1071. Vt*venpair(St*st,vt*self,Vt*x,Vt*y);
  1072. Vt*vjoin(St*st,vt*self,Vt*x,Vt*y){Ar*l;
  1073. if(xt==ARRAY&&yt==ARRAY){if(!xad&&!yad)R st->unit;
  1074. elif(!xad)R y;
  1075. elif(!yad)R x;
  1076. l=Ank(xal+yal);
  1077. Z lp=0;
  1078. for(Z i=0;i<xal;i++)l->data[lp++]=xad[i];
  1079. for(Z i=0;i<yal;i++)l->data[lp++]=yad[i];}
  1080. elif(xt==ARRAY&&yt!=ARRAY){if(!xad)R venlist(st,N,y);
  1081. l=Ank(xal+1);
  1082. Z lp=0;
  1083. for(Z i=0;i<xal;i++)l->data[lp++]=xad[i];
  1084. l->data[lp++]=y;}
  1085. elif(xt!=ARRAY&&yt==ARRAY){if(!yad)R venlist(st,N,x);
  1086. l=Ank(yal+1);
  1087. Z lp=0;
  1088. l->data[lp++]=x;
  1089. for(Z i=0;i<yal;i++)l->data[lp++]=yad[i];}
  1090. else R venpair(st,N,x,y);R Vna(l);}
  1091. Vt*venpair(St*st,vt*self,Vt*x,Vt*y){Ar*l=Ank(2);
  1092. l->data[0]=x;
  1093. l->data[1]=y;R Vna(l);}
  1094. Vt*vselfref1(St*st,vt*self,Vt*x){vt*v;
  1095. if(st->args->data)v=Ai(Ai(st->args,-1),-1);
  1096. elif(st->selfrefs->data)v=Ai(st->selfrefs,-1);
  1097. else R st->udf;R eR(st,v,x,0,v->rank[0]);}
  1098. Vt*vselfref2(St*st,vt*self,Vt*x,Vt*y){vt*v;
  1099. if(st->args->data)v=Ai(Ai(st->args,-1),-1);
  1100. elif(st->selfrefs->data)v=Ai(st->selfrefs,-1);
  1101. else R st->udf;R tgth(st,v,x,y,0,0,v->rank[1],v->rank[2]);}
  1102. Vt*vtake(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM){if(yt!=ARRAY){if(xn==0)R st->unit;
  1103. else R x;}
  1104. if(xn==0||!yad)R st->unit;
  1105. B rev=xn<0;
  1106. Z k=(Z)fabs(xn);
  1107. Ar*r=Ank(yal<k?yal:k);
  1108. Z p=0;
  1109. if(rev)for(SZ i=k;i>0;i--){Vt*v=Ai(ya,-i);
  1110. if(!v)CN;
  1111. r->data[p++]=v;}
  1112. else for(Z i=0;i<yal&&k;i++,k--)r->data[p++]=yad[i];R Vna(r);}
  1113. R st->udf;}
  1114. Vt*vwhere(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  1115. elif(!xad)R x;
  1116. Ar*r=An();
  1117. for(Z i=0;i<xal;i++){Vt*a=xad[i];
  1118. if(a->tag!=NUM)BR;
  1119. Z k=fabs(a->val.number);
  1120. for(Z j=0;j<k;j++)Ap(r,Vnn(i));}
  1121. R Vna(r);}
  1122. Vt*vcopy(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,N,x);
  1123. if(yt!=ARRAY)y=venlist(st,N,y);
  1124. Ar*tx=xa;
  1125. Ar*ty=ya;
  1126. if(!tx->data||!ty->data)R st->unit;
  1127. Ar*r=An();
  1128. for(Z i=0;i<tx->length;i++){Vt*a=tx->data[i];
  1129. Vt*b=ty->data[i>=ty->length?ty->length-1:i];
  1130. if(b->tag!=NUM)BR;
  1131. Z k=fabs(b->val.number);
  1132. for(Z i=0;i<k;i++)Ap(r,a);}
  1133. R Vna(r);}
  1134. Vt*vnub(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R x;
  1135. Ar*n=Ank(xal);
  1136. Ar*r=An();
  1137. for(Z i=0;i<xal;i++){B u=T;
  1138. for(Z j=0;j<r->length;j++)if(Veq(xad[i],r->data[j])){u=F;BR;}
  1139. if(u)Ap(r,xad[i]);
  1140. n->data[i]=u?NUMS[1]:NUMS[0];}
  1141. FR(r->data);
  1142. FR(r);R Vna(n);}
  1143. Vt*vdrop(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM){if(yt!=ARRAY){if(xn==0)R y;
  1144. else R st->unit;}
  1145. if(xn==0)R y;
  1146. if(!yad)R st->unit;
  1147. B rev=xn<0;
  1148. Z k=(Z)fabs(xn);
  1149. if(k>=yal)R st->unit;
  1150. if(rev){Z l=yal;
  1151. if(k>=l)R st->unit;R vtake(st,N,Vnn(l-k),y);}
  1152. Ar*r=Ank(yal-k);
  1153. Z rp=0;
  1154. for(Z i=k;i<yal;i++)r->data[rp++]=yad[i];R Vna(r);}
  1155. R st->udf;}
  1156. Vt*vunique(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R x;
  1157. Ar*r=An();
  1158. for(Z i=0;i<xal;i++){B u=T;
  1159. for(Z j=0;j<r->length;j++)if(Veq(xad[j],r->data[j])){u=F;BR;}
  1160. if(u)Ap(r,xad[i]);}
  1161. R Vna(r);}
  1162. Vt*vfind(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,self,y);
  1163. elif(!yad)R st->unit;
  1164. Ar*r=An();
  1165. for(Z i=0;i<yal;i++)if(Veq(yad[i],x))Ap(r,Vnn(i));R Vna(r);}
  1166. Vt*vindexof(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,self,y);
  1167. elif(!yad)R st->unit;
  1168. SZ n=indexOf(ya,x);
  1169. if(n<0)n=yal;R Vnn(n);}
  1170. Vt*vcount(St*st,vt*self,Vt*x){if(xt!=ARRAY)R NUMS[1];R Vnn(xal);}
  1171. V flatten(Vt*x,Ar*r){if(xt==ARRAY)
  1172. for(Z i=0;i<xal;i++)flatten(xad[i],r);
  1173. else Ap(r,x);}
  1174. Vt*vflatten(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R x;
  1175. Ar*r=An();
  1176. flatten(x,r);R Vna(r);}
  1177. Vt*vminand(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)<Vnum(y))R x;R y;}
  1178. R _NAN;}
  1179. Vt*vreverse(St*st,vt*self,Vt*x){if(xt!=ARRAY)R x;
  1180. if(xal<2)R x;
  1181. Ar*r=Ank(xal);
  1182. Z rp=0;
  1183. for(SZ i=xal-1;i>=0;i--)r->data[rp++]=xad[i];R Vna(r);}
  1184. Vt*vmaxor(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(Vnum(x)>Vnum(y))R x;R y;}
  1185. R _NAN;}
  1186. Vt*vrotate(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||yal<2)R x;
  1187. if(xt!=NUM)R st->udf;
  1188. B rev=xn<0;
  1189. Z k=fabs(xn);
  1190. Ar*r=Ac(ya);
  1191. for(Z i=0;i<k;i++){Vt*v;
  1192. if(rev){v=r->data[0];
  1193. for(Z j=0;j<r->length-1;j++)r->data[j]=r->data[j+1];
  1194. r->data[r->length-1]=v;}
  1195. else{v=r->data[r->length-1];
  1196. for(Z j=r->length-1;j>0;j--)r->data[j]=r->data[j-1];
  1197. r->data[0]=v;}}
  1198. R Vna(r);}
  1199. Vt*vwindows(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,y);
  1200. elif(!yad)R y;
  1201. Z k=fabs(xn);
  1202. Z l=yal;
  1203. Ar*r=An();
  1204. for(Z i=0;i<l;i++){if(i+k>l)BR;
  1205. Ap(r,vtake(st,N,Vnn(k),vdrop(st,N,Vnn(i),y)));}
  1206. R Vna(r);}
  1207. Z depthOf(Vt*x,Z d){if(xt==ARRAY){if(!xad)R 0;
  1208. for(Z i=0;i<xal;i++){Z d2=depthOf(xad[i],d+1);
  1209. if(d2>d)d=d2;}
  1210. R d;}
  1211. R 0;}
  1212. Vt*vdepth(St*st,vt*self,Vt*x){R Vnn(depthOf(x,1));}
  1213. Vt*vround(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(round(xn));R _NAN;}
  1214. Vt*vabs(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(fabs(xn));R _NAN;}
  1215. Vt*vtail(St*st,vt*self,Vt*x);
  1216. Vt*vat(St*st,vt*self,Vt*x,Vt*y){if(yt!=NUM)R st->udf;
  1217. if(xt!=ARRAY){if(yn>-1&&yn<1)R x;
  1218. else R st->udf;}
  1219. if(!xad)R st->nil;
  1220. Vt*v=Ai(xa,(SZ)yn);
  1221. if(!v)R st->udf;R v;}
  1222. Vt*vmember(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,self,y);
  1223. elif(!yad)R NUMS[0];
  1224. for(Z i=0;i<yal;i++)if(Veq(yad[i],x))R NUMS[1];R NUMS[0];}
  1225. Vt*vshuffle(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,self,x);
  1226. elif(!xad)R x;
  1227. Ar*r=Ac(xa);
  1228. for(Z i=0;i<r->length;i++){Z j=rand()%r->length;
  1229. Vt*tmp=r->data[i];
  1230. r->data[i]=r->data[j];
  1231. r->data[j]=tmp;}
  1232. R Vna(r);}
  1233. Vt*vhead(St*st,vt*self,Vt*x){R vtake(st,N,NUMS[2],x);}
  1234. Vt*vbin(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,self,x);
  1235. elif(!xad)R x;
  1236. if(yt!=ARRAY)y=venlist(st,self,x);
  1237. elif(!yad)R y;
  1238. Z xl=xal;
  1239. Ar*bins=An();
  1240. for(Z i=0;i<xl;i++){D s;
  1241. D e;
  1242. Vt*vs=xad[i];
  1243. if(vs->tag==NUM)s=vs->val.number;
  1244. elif(vs->tag==CHAR)s=vs->val._char;
  1245. else R st->udf;
  1246. Vt*ve=i==xl-1?Vnn(s+1):xad[i+1];
  1247. if(ve->tag==NUM)e=fabs(ve->val.number);
  1248. elif(ve->tag==CHAR)e=ve->val._char;
  1249. else R st->udf;
  1250. if(bins->data){Ar*pp=Ai(bins,-1);
  1251. D*pe=pp->data[0];
  1252. if(s<=(*pe))R st->udf;}
  1253. D*sn=ma(SO(D));
  1254. *sn=s;
  1255. D*en=ma(SO(D));
  1256. *en=e;
  1257. Ar*p=An();
  1258. Ap(p,sn);
  1259. Ap(p,en);
  1260. Ap(bins,p);}
  1261. Z bl=bins->length;
  1262. Ar*r=An();
  1263. Z yl=yal;
  1264. for(Z i=0;i<yl;i++){Vt*it=yad[i];
  1265. D itv;
  1266. if(it->tag==NUM)itv=it->val.number;
  1267. elif(it->tag==CHAR)itv=it->val._char;
  1268. else R st->udf;
  1269. Ar*b=bins->data[0];
  1270. D*s=b->data[0];
  1271. if(itv<(*s)){Ap(r,NNUMS[0]);CN;}
  1272. b=Ai(bins,-1);
  1273. s=b->data[1];
  1274. if(itv>=(*s)){Ap(r,Vnn(bl-1));CN;}
  1275. D v=NAN;
  1276. for(Z j=0;j<bl;j++){b=bins->data[j];
  1277. D*s=b->data[0];
  1278. D*e=b->data[1];
  1279. if(itv>=(*s)&&itv<(*e)){v=j;BR;}}
  1280. if(!isnan(v))Ap(r,Vnn(v));}
  1281. for(Z j=0;j<bl;j++){Ar*b=bins->data[j];
  1282. FR(b->data[0]);
  1283. FR(b->data[1]);
  1284. FR(b->data);
  1285. FR(b);}
  1286. FR(bins->data);
  1287. FR(bins);R Vna(r);}
  1288. Vt*vtail(St*st,vt*self,Vt*x){if(xt!=ARRAY)R x;
  1289. if(!xad)R st->udf;R Ai(xa,-1);}
  1290. Vt*vcut(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,self,x);
  1291. elif(!xad)R x;
  1292. if(yt!=ARRAY)y=venlist(st,self,x);
  1293. elif(!yad)R x;
  1294. if(xal!=2)R st->udf;
  1295. Vt*vs=xad[0];
  1296. Vt*ve=xad[1];
  1297. if(vs->tag!=NUM||ve->tag!=NUM)R st->udf;
  1298. Z s=fabs(vs->val.number);
  1299. Z e=fabs(ve->val.number);
  1300. Ar*r=An();
  1301. Z l=yal;
  1302. Ar*pa=An();
  1303. for(Z i=s;i<e&&i<l;i++){Vt*v=Ai(ya,i);
  1304. if(!v)BR;
  1305. Ap(pa,v);}
  1306. Ar*pb=An();
  1307. for(Z i=e;i<l;i++){Vt*v=Ai(ya,i);
  1308. if(!v)BR;
  1309. Ap(pb,v);}
  1310. Ap(r,Vna(pa));
  1311. Ap(r,Vna(pb));R Vna(r);}
  1312. Vt*vprefixes(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  1313. Ar*r=An();
  1314. for(Z i=0;i<xal;i++)Ap(r,vtake(st,N,Vnn(i),x));
  1315. Ap(r,x);R Vna(r);}
  1316. Vt*vbehead(St*st,vt*self,Vt*x){R vdrop(st,N,NUMS[1],x);}
  1317. Vt*vcurtail(St*st,vt*self,Vt*x){R vdrop(st,N,NNUMS[0],x);}
  1318. Vt*vsuffixes(St*st,vt*self,Vt*x){if(xt!=ARRAY)x=venlist(st,N,x);
  1319. Ar*r=An();
  1320. for(Z i=0;i<xal;i++)Ap(r,vdrop(st,N,Vnn(i),x));
  1321. Ap(r,st->unit);R Vna(r);}
  1322. Vt*vleft(St*st,vt*self,Vt*x,Vt*y){R x;}
  1323. Vt*vsame(St*st,vt*self,Vt*x){R x;}
  1324. Vt*vright(St*st,vt*self,Vt*x,Vt*y){R y;}
  1325. Vt*vsymbol(St*st,vt*self,Vt*x){S s=Vshow(x);R Vny(s);}
  1326. Vt*vapply1(St*st,vt*self,Vt*x,Vt*y){R apM(st,x,y);}
  1327. Vt*vapply2(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||yal<2)R st->udf;R apD(st,x,yad[0],yad[1]);}
  1328. Vt*vshape(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R st->unit;
  1329. if(!Aap(xa))R venlist(st,N,vcount(st,N,x));
  1330. if(xal<2)R venlist(st,N,vshape(st,N,xad[0]));R venpair(st,N,vcount(st,N,x),vcount(st,N,xad[0]));}
  1331. Vt*vreshape(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,y);
  1332. elif(!yad)R y;
  1333. if(xt!=ARRAY)x=venlist(st,N,x);
  1334. elif(!xad)R st->unit;
  1335. Ar*r;
  1336. if(xal<2){Vt*a=xad[0];
  1337. if(a->tag!=NUM)R st->udf;
  1338. Z k=fabs(a->val.number);
  1339. Ar*t=An();
  1340. flatten(y,t);
  1341. r=Ank(k);
  1342. for(Z i=0;i<k;i++)r->data[i]=t->data[i>=t->length?t->length-1:i];}elif(xal>1){Vt*a=xad[0];
  1343. if(a->tag!=NUM)R st->udf;
  1344. Vt*b=xad[1];
  1345. if(a->tag!=NUM)R st->udf;
  1346. Z k=fabs(a->val.number);
  1347. Z l=fabs(b->val.number);
  1348. y=vreshape(st,self,venlist(st,N,Vnn(k*l)),y);
  1349. r=An();
  1350. WH(k--){Ar*rw=An();
  1351. for(Z i=0;i<l;i++)Ap(rw,yad[i]);
  1352. Ap(r,Vna(rw));}}else R st->udf;R Vna(r);}
  1353. Vt*vrepr(St*st,vt*self,Vt*x){S s=Vshow(x);
  1354. Ar*r=An();
  1355. for(Z i=0;i<strlen(s);i++)Ap(r,Vnc(s[i]));
  1356. FR(s);R Vna(r);}
  1357. S format(S template,Ar*replaces){Bt*text=Bnew();
  1358. B skip=F;
  1359. Z ri=0;
  1360. Z tl=strlen(template);
  1361. Z rl=replaces->length;
  1362. for(Z i=0;i<tl;i++){C c=template[i];
  1363. if(skip){Bappend(text,c);
  1364. skip=F;CN;}
  1365. if(c=='_'){S s=Vshow(Ai(replaces,ri));
  1366. BappendS(text,s);
  1367. FR(s);
  1368. if(ri<rl-1)ri++;CN;}elif(c=='{'){Z bi=i;
  1369. Bt*n=Bnew();
  1370. i++;
  1371. WH(i<tl&&template[i]!='}')Bappend(n,template[i++]);
  1372. if(i>=tl||template[i]!='}'){FR(Bread(n));
  1373. Bappend(text,'{');
  1374. i=bi;CN;}
  1375. S s=Bread(n);
  1376. SZ ind=atoi(s);
  1377. FR(s);
  1378. Vt*v=Ai(replaces,ind);
  1379. if(!v)CN;
  1380. s=Vshow(v);
  1381. BappendS(text,s);
  1382. FR(s);CN;}elif(c=='~'){skip=T;CN;}
  1383. Bappend(text,c);}
  1384. R Bread(text);}
  1385. Vt*vformat(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,x);
  1386. elif(!yad)R y;
  1387. S fmt=Vshow(x);
  1388. S s=format(fmt,ya);
  1389. FR(fmt);
  1390. Z z=strlen(s);
  1391. Ar*r=Ank(z);
  1392. for(Z i=0;i<z;i++)r->data[i]=CHARS[s[i]];R Vna(r);}
  1393. Vt*vinsert(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,y);
  1394. elif(!yad)R y;
  1395. Ar*r=Ank(yal*2-1);
  1396. Z rp=0;
  1397. for(Z i=0;i<yal;i++){r->data[rp++]=yad[i];
  1398. if(i!=yal-1)r->data[rp++]=x;}
  1399. R Vna(r);}
  1400. U64 fibonacci(U64 n){U64 a=0;
  1401. U64 b=1;
  1402. WH(n-->1){U64 t=a;
  1403. a=b;
  1404. b+=t;}
  1405. R b;}
  1406. Vt*vfibonacci(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(fibonacci((U64)fabs(xn)));R _NAN;}
  1407. Vt*viota(St*st,vt*self,Vt*x){if(Veq(x,NUMS[1]))R venlist(st,N,NUMS[1]);
  1408. elif(Veq(x,NUMS[0]))R st->unit;R vrange(st,self,NUMS[1],x);}
  1409. Vt*vrange(St*st,vt*self,Vt*x,Vt*y){if((xt==NUM||xt==CHAR)&&(yt==NUM||yt==CHAR)){if(xt==NUM&&spnp(xn))R st->udf;
  1410. if(yt==NUM&&spnp(yn))R st->udf;
  1411. SZ s=Vnum(x);
  1412. SZ e=Vnum(y);
  1413. if(s==e)R venlist(st,N,x);
  1414. Z p=0;
  1415. Ar*r=Ank((s>e?s-e:e-s)+1);
  1416. if(s>e)for(SZ i=s;i>=e;i--){if(xt==CHAR||yt==CHAR)r->data[p++]=CHARS[i];
  1417. else r->data[p++]=Vnn(i);}
  1418. else for(SZ i=s;i<=e;i++){if(xt==CHAR||yt==CHAR)r->data[p++]=CHARS[i];
  1419. else r->data[p++]=Vnn(i);}
  1420. R Vna(r);}
  1421. R _NAN;}
  1422. Vt*vdeal(St*st,vt*self,Vt*x){if(xt!=ARRAY)R x;
  1423. if(!xad)R st->udf;R xad[rand()%xal];}
  1424. Vt*vroll(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM){Z k=fabs(xn);
  1425. Z d=fabs(yn);
  1426. Ar*r=Ank(k);
  1427. for(Z i=0;i<k;i++)r->data[i]=Vnn(rand()%d);R Vna(r);}
  1428. R st->udf;}
  1429. Vt*vtype(St*st,vt*self,Vt*x){R NUMS[xt];}
  1430. Vt*vcast(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM){I t=fabs(xn);
  1431. if(yt==t)R y;
  1432. SW(t){CS ARRAY:if(yt==SYM){S s=yY;
  1433. Z z=strlen(s);
  1434. Ar*r=Ank(z);
  1435. for(Z i=0;i<z;i++)r->data[i]=CHARS[s[i]];R Vna(r);}BR;
  1436. CS NUM:if(yt==CHAR)R Vnn(y->val._char);
  1437. elif(yt==ARRAY&&Cap(ya)){Bt*buf=Bnew();
  1438. for(Z i=0;i<yal;i++)Bappend(buf,((Vt*)yad[i])->val._char);
  1439. S s=Bread(buf);
  1440. D r=strtod(s,N);
  1441. FR(s);R Vnn(r);}BR;
  1442. CS CHAR:if(yt==NUM)R Vnc(yn);BR;}}
  1443. R st->udf;}
  1444. Vt*vprint(St*st,vt*self,Vt*x){S s=Vshow(x);
  1445. fprintf(stdout,"%s",s);
  1446. FR(s);R st->nil;}
  1447. Vt*vprintln(St*st,vt*self,Vt*x){S s=Vshow(x);
  1448. fprintf(stdout,"%s\n",s);
  1449. FR(s);R st->nil;}
  1450. Vt*vexit(St*st,vt*self,Vt*x){if(xt!=NUM)R st->udf;
  1451. I code=xn;
  1452. exit(code);R st->nil;}
  1453. Vt*vread(St*st,vt*self,Vt*x){if(x==NUMS[0]){Bt*buf=Bnew();
  1454. Z size=0;
  1455. LOOP{I c=fgetc(stdin);
  1456. if(c<0)BR;
  1457. Bappend(buf,c);size++;}
  1458. S s=Bread(buf);
  1459. Ar*r=Ank(size);
  1460. for(Z i=0;i<size;i++)r->data[i]=CHARS[s[i]];
  1461. FR(s);R Vna(r);}
  1462. elif(x==NUMS[1]){C line[512];
  1463. if(!fgets(line,SO(line),stdin))R st->udf;
  1464. Z z=strlen(line);
  1465. Ar*r=Ank(z);
  1466. for(Z i=0;i<z;i++)r->data[i]=CHARS[line[i]];R Vna(r);}
  1467. S path=Vshow(x);
  1468. FILE*fd=fopen(path,"rb");
  1469. if(!fd){FR(path);R st->udf;}
  1470. fseek(fd,0,SEEK_END);
  1471. Z size=ftell(fd);
  1472. fseek(fd,0,SEEK_SET);
  1473. UC*buf=ma(size+1);
  1474. if(!buf)R st->udf;
  1475. size=fread(buf,SO(UC),size,fd);
  1476. fclose(fd);
  1477. FR(path);
  1478. Ar*r=Ank(size);
  1479. for(Z i=0;i<size;i++)r->data[i]=CHARS[buf[i]];
  1480. FR(buf);R Vna(r);}
  1481. Vt*vwrite(St*st,vt*self,Vt*x,Vt*y){FILE*fd;
  1482. S path=N;
  1483. if(xt!=ARRAY)x=venlist(st,N,x);
  1484. if(y==NUMS[0])fd=stderr;
  1485. else{path=Vshow(y);
  1486. fd=fopen(path,"wb");
  1487. if(!fd){FR(path);R NNUMS[0];}}
  1488. Z k=0;
  1489. for(Z i=0;i<xal;i++){UC c;
  1490. Vt*v=xad[i];
  1491. if(v->tag==NUM)c=fabs(vn);
  1492. elif(v->tag==CHAR)c=v->val._char;
  1493. else BR;
  1494. fputc(c,fd);
  1495. k++;}
  1496. fclose(fd);
  1497. if(path)FR(path);R Vnn(k);}
  1498. Vt*vsystem(St*st,vt*self,Vt*x){S cmd=Vshow(x);
  1499. FILE*pd;
  1500. pd=popen(cmd,"r");
  1501. if(!pd){FR(cmd);R st->udf;}
  1502. UC*buffer=N;
  1503. Z Bsize=0;
  1504. Z Ballocated=0;
  1505. Z bytes_received;
  1506. UC chunk[1024];
  1507. LOOP{bytes_received=fread(chunk,1,1024,pd);
  1508. if(bytes_received==0)BR;
  1509. Z head=Bsize;
  1510. Bsize+=bytes_received;
  1511. if(Bsize>Ballocated){Ballocated=Bsize;
  1512. if(!buffer)buffer=ma(Ballocated);
  1513. else buffer=mrea(buffer,Ballocated);
  1514. if(!buffer){FR(cmd);
  1515. pclose(pd);R st->udf;}}
  1516. for(Z i=0;i<bytes_received;i++)buffer[head+i]=chunk[i];
  1517. if(feof(pd))BR;}
  1518. pclose(pd);
  1519. FR(cmd);
  1520. Ar*r=Ank(Bsize);
  1521. for(Z i=0;i<Bsize;i++)r->data[i]=CHARS[buffer[i]];
  1522. FR(buffer);R Vna(r);}
  1523. struct files_t{FILE*in;
  1524. FILE*out;};
  1525. typedef struct files_t files_t;
  1526. struct files_chain_t{files_t files;
  1527. pid_t pid;
  1528. struct files_chain_t*next;};
  1529. typedef struct files_chain_t files_chain_t;
  1530. static files_chain_t*files_chain;
  1531. V _cleanup_pipe(int*pipe){close(pipe[0]);
  1532. close(pipe[1]);}
  1533. static I _do_popen2(files_chain_t*link,cS command){I child_in[2];
  1534. I child_out[2];
  1535. if(0!=pipe(child_in))return-1;
  1536. if(0!=pipe(child_out)){_cleanup_pipe(child_in);
  1537. return-1;}
  1538. pid_t cpid=link->pid=fork();
  1539. if(0>cpid){_cleanup_pipe(child_in);
  1540. _cleanup_pipe(child_out);
  1541. return-1;}
  1542. if(0==cpid){if(0>dup2(child_in[0],0)||0>dup2(child_out[1],1))_Exit(127);
  1543. _cleanup_pipe(child_in);
  1544. _cleanup_pipe(child_out);
  1545. for(files_chain_t*p=files_chain;p;p=p->next){I fd_in=fileno(p->files.in);
  1546. if(fd_in!=0)close(fd_in);
  1547. I fd_out=fileno(p->files.out);
  1548. if(fd_out!=1)close(fd_out);}
  1549. execl("/bin/sh","sh","-c",command,(S )N);
  1550. _Exit(127);}
  1551. close(child_in[0]);
  1552. close(child_out[1]);
  1553. link->files.in=fdopen(child_in[1],"w");
  1554. link->files.out=fdopen(child_out[0],"r");R 0;}
  1555. files_t*popen2(cS command){files_chain_t*link=(files_chain_t*)malloc(SO(files_chain_t));
  1556. if(N==link)R N;
  1557. if(0>_do_popen2(link,command)){free(link);R N;}
  1558. link->next=files_chain;
  1559. files_chain=link;R(files_t*)link;}
  1560. I pclose2(files_t*fp){files_chain_t**p=&files_chain;
  1561. I found=0;
  1562. WH(*p){if(*p==(files_chain_t*)fp){*p=(*p)->next;
  1563. found=1;BR;}
  1564. p=&(*p)->next;}
  1565. if(!found)return-1;
  1566. if(0>fclose(fp->out)){free((files_chain_t*)fp);
  1567. return-1;}
  1568. I status=-1;
  1569. pid_t wait_pid;
  1570. do{wait_pid=waitpid(((files_chain_t*)fp)->pid,&status,0);}WH(-1==wait_pid&&EINTR==errno);
  1571. free((files_chain_t*)fp);
  1572. if(wait_pid==-1)return-1;R status;}
  1573. Vt*vsystem2(St*st,vt*self,Vt*x,Vt*y){S cmd=Vshow(y);
  1574. files_t*pd;
  1575. pd=popen2(cmd);
  1576. if(pd==N){FR(cmd);R st->udf;}
  1577. for(Z i=0;i<xal;i++){UC c;
  1578. Vt*v=xad[i];
  1579. if(v->tag==NUM)c=fabs(vn);
  1580. elif(v->tag==CHAR)c=v->val._char;
  1581. else BR;
  1582. fputc(c,pd->in);}
  1583. fflush(pd->in);
  1584. fclose(pd->in);
  1585. UC*buffer=N;
  1586. Z Bsize=0;
  1587. Z Ballocated=0;
  1588. Z bytes_received;
  1589. UC chunk[1024];
  1590. LOOP{bytes_received=fread(chunk,1,1024,pd->out);
  1591. if(bytes_received==0)BR;
  1592. Z head=Bsize;
  1593. Bsize+=bytes_received;
  1594. if(Bsize>Ballocated){Ballocated=Bsize;
  1595. if(!buffer)buffer=ma(Ballocated);
  1596. else buffer=mrea(buffer,Ballocated);
  1597. if(!buffer){FR(cmd);
  1598. pclose2(pd);R st->udf;}}
  1599. for(Z i=0;i<bytes_received;i++)buffer[head+i]=chunk[i];
  1600. if(feof(pd->out))BR;}
  1601. pclose2(pd);
  1602. FR(cmd);
  1603. Ar*r=Ank(Bsize);
  1604. for(Z i=0;i<Bsize;i++)r->data[i]=CHARS[buffer[i]];
  1605. FR(buffer);R Vna(r);}
  1606. Vt*vshl(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(((int)xn)<<((int)yn));R _NAN;}
  1607. Vt*vshr(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(((int)xn)>>((int)yn));R _NAN;}
  1608. Vt*vxor(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(((int)xn)^((int)yn));R _NAN;}
  1609. Vt*vband(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(((int)xn)&((int)yn));R _NAN;}
  1610. Ar*find_primes(U64 limit){B sieve[limit+1];
  1611. for(U64 i=0;i<=limit;i++)sieve[i]=F;
  1612. if(limit>2)sieve[2]=T;
  1613. if(limit>3)sieve[3]=T;
  1614. for(U64 x=1;x*x<=limit;x++)for(U64 y=1;y*y<=limit;y++){U64 n=(4*x*x)+(y*y);
  1615. if(n<=limit&&(n%12==1||n%12==5))sieve[n]^=T;
  1616. n=(3*x*x)+(y*y);
  1617. if(n<=limit&&n%12==7)sieve[n]^=T;
  1618. n=(3*x*x)-(y*y);
  1619. if(x>y&&n<=limit&&n%12==11)sieve[n]^=T;}
  1620. for(U64 r=5;r*r<=limit;r++)if(sieve[r])for(I i=r*r;i<=limit;i+=r*r)sieve[i]=F;
  1621. Ar*r=An();
  1622. for(U64 a=1;a<=limit;a++)if(sieve[a])Ap(r,Vnn(a));R r;}
  1623. Vt*vprimes(St*st,vt*self,Vt*x){if(xt==NUM&&!spnp(xn))R Vna(find_primes(fabs(xn)+1));R st->udf;}
  1624. Vt*vparts(St*st,vt*self,Vt*x,Vt*y){if(xt!=NUM)R st->udf;
  1625. if(yt!=ARRAY)y=venlist(st,N,y);
  1626. elif(!yad)R y;
  1627. if(spnp(xn)||xn<1)R y;
  1628. Z np=fabs(xn);
  1629. Ar*r=Ank(np);
  1630. Z rp=0;
  1631. for(SZ i=np;i>0;i--){Z k=ceil(((D)yal)/(D)i);
  1632. r->data[rp++]=vtake(st,N,Vnn(k),y);
  1633. y=vdrop(st,N,Vnn(k),y);}
  1634. R Vna(r);}
  1635. Vt*vbor(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM)R Vnn(((int)xn)|((int)yn));R _NAN;}
  1636. Vt*vbnot(St*st,vt*self,Vt*x){if(xt==NUM)R Vnn(~(int)xn);R _NAN;}
  1637. Ar*prime_factors(D n){Ar*factors=An();
  1638. D divisor=2;
  1639. WH(n>=2){if(fmod(n,divisor)==0){Ap(factors,Vnn(divisor));
  1640. n/=divisor;}else divisor++;}
  1641. R factors;}
  1642. Vt*vfactors(St*st,vt*self,Vt*x){if(xt==NUM&&!spnp(xn))R Vna(prime_factors(xn));R st->udf;}
  1643. Vt*vcombine(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM&&!spnp(xn)&&!spnp(yn)){x=vbase(st,N,NUMS[10],x);
  1644. y=vbase(st,N,NUMS[10],y);
  1645. Vt*n=vjoin(st,N,x,y);R vunbase(st,N,NUMS[10],n);}
  1646. R _NAN;}
  1647. Vt*voutof(St*st,vt*self,Vt*x,Vt*y){if(xt==NUM&&yt==NUM&&!spnp(xn)&&!spnp(yn)&&xn>0&&yn>0){U64 a=(U64)fabs(xn);
  1648. U64 b=(U64)fabs(yn);R Vnn(factorial(b)/(factorial(a)*(a>=b?1:factorial(b-a))));}
  1649. R _NAN;}
  1650. Vt*vsort(St*st,vt*self,Vt*x){Vt*i=vgradeup(st,N,x);R tgth(st,st->at,x,i,0,0,st->at->rank[1],st->at->rank[2]);}
  1651. Vt*vunsort(St*st,vt*self,Vt*x){Vt*i=vgradedown(st,N,x);R tgth(st,st->at,x,i,0,0,st->at->rank[1],st->at->rank[2]);}
  1652. Vt*Srun(St*st,S program);
  1653. Vt*veval(St*st,vt*self,Vt*x){S s=Vshow(x);
  1654. jmp_buf*lb=guard();
  1655. if(setjmp(*lb)){unguard();
  1656. FR(s);R st->udf;}
  1657. Vt*v=Srun(st,s);
  1658. FR(s);
  1659. unguard();R v;}
  1660. Vt*vimport(St*st,vt*self,Vt*x){S path=Vshow(x);
  1661. FILE*fd=fopen(path,"rb");
  1662. if(!fd){FR(path);R st->udf;}
  1663. fseek(fd,0,SEEK_END);
  1664. Z size=ftell(fd);
  1665. fseek(fd,0,SEEK_SET);
  1666. UC*buf=ma(size+1);
  1667. if(!buf)R st->udf;
  1668. size=fread(buf,SO(UC),size,fd);
  1669. fclose(fd);
  1670. FR(path);
  1671. Vt*v=Srun(st,(S )buf);
  1672. FR(buf);R v;}
  1673. Vt*vexplode(St*st,vt*self,Vt*x,Vt*y){S del=Vshow(x);
  1674. S s=Vshow(y);
  1675. Z dell=strlen(del);
  1676. Z sl=strlen(s);
  1677. Ar*r=An();
  1678. Ar*t=An();
  1679. for(Z i=0;i<sl;i++){if(strncmp(&s[i],del,dell)==0){Ap(r,Vna(t));
  1680. t=An();
  1681. i+=dell-1;CN;}
  1682. Ap(t,CHARS[s[i]]);}
  1683. FR(s);
  1684. FR(del);
  1685. Ap(r,Vna(t));R Vna(r);}
  1686. Vt*vimplode(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||!yad)R y;
  1687. S del=Vshow(x);
  1688. Ar*r=An();
  1689. for(Z i=0;i<yal;i++){S s=Vshow(yad[i]);
  1690. S _s=s;
  1691. WH(*_s)Ap(r,CHARS[*_s++]);
  1692. FR(s);
  1693. if(i!=yal-1){S s=del;
  1694. WH(*s)Ap(r,CHARS[*s++]);}}
  1695. FR(del);R Vna(r);}
  1696. Vt*vtackleft(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,y);
  1697. Ar*r=Ank(yal+1);
  1698. r->data[0]=x;
  1699. for(Z i=0;i<yal;i++)r->data[i+1]=yad[i];R Vna(r);}
  1700. Vt*vtackright(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY)y=venlist(st,N,y);
  1701. Ar*r=Ank(yal+1);
  1702. for(Z i=0;i<yal;i++)r->data[i]=yad[i];
  1703. r->data[yal]=x;R Vna(r);}
  1704. Vt*veye(St*st,vt*self,Vt*x){if(xt==NUM&&!spnp(xn)){Z k=fabs(xn);
  1705. Ar*r=Ank(k);
  1706. for(Z i=0;i<k;i++){Ar*rw=Ank(k);
  1707. for(Z j=0;j<k;j++)rw->data[j]=NUMS[i==j];
  1708. r->data[i]=Vna(rw);}
  1709. R Vna(r);}
  1710. R st->udf;}
  1711. Vt*vudf1(St*st,vt*self,Vt*x){R st->udf;}
  1712. Vt*vudf2(St*st,vt*self,Vt*x,Vt*y){R st->udf;}
  1713. #define X UINT_MAX
  1714. #define DEFVERB(__symb,__rm,__rl,__rr,__m,__d){__symb,{__rm,__rl,__rr},N,F,F,v##__m,v##__d}
  1715. #define DEFVERBD(__symb,__rm,__rl,__rr,__m,__d){__symb ".",{__rm,__rl,__rr},N,F,F,v##__m,v##__d}
  1716. #define DEFVERBC(__symb,__rm,__rl,__rr,__m,__d){__symb ":",{__rm,__rl,__rr},N,F,F,v##__m,v##__d}
  1717. vt VERBS[]={DEFVERB(":",0,0,0,const,bind),DEFVERBC(":",X,0,0,unbind,obverse),DEFVERB("+",0,X,X,flip,plus),DEFVERBD("+",X,X,X,fibonacci,gcd),DEFVERBC("+",X,X,X,sin,combine),DEFVERB("-",X,X,X,negate,minus),DEFVERBD("-",X,X,X,atan,atan2),DEFVERB("*",0,X,X,first,times),DEFVERBD("*",X,X,X,factorial,lcm),DEFVERBC("*",X,X,0,double,replicate),DEFVERB("%",X,X,X,reciprocal,divide),DEFVERBD("%",X,X,X,sqrt,root),DEFVERBC("%",X,X,X,halve,idivide),DEFVERB("!",X,X,X,enum,mod),DEFVERBD("!",X,X,X,iota,range),DEFVERBC("!",0,X,0,odometer,chunks),DEFVERB("^",X,X,X,exp,power),DEFVERBD("^",X,X,X,nlog,log),DEFVERB("=",0,X,X,permute,equals),DEFVERBD("=",0,0,0,occurences,mask),DEFVERBC("=",0,0,0,classify,equals),DEFVERB("~",X,X,X,not,not_equals),DEFVERBD("~",X,0,0,sign,insert),DEFVERBC("~",0,0,0,not,not_equals),DEFVERB("<",X,X,X,pred,less),DEFVERBD("<",X,X,X,floor,lesseq),DEFVERBC("<",0,X,0,gradedown,nudge_left),DEFVERB(">",X,X,X,succ,greater),DEFVERBD(">",X,X,X,ceil,greatereq),DEFVERBC(">",0,X,0,gradeup,nudge_right),DEFVERB(",",0,0,0,enlist,join),DEFVERBD(",",X,0,0,enlist,enpair),DEFVERB("#",0,X,0,count,take),DEFVERBD("#",0,0,0,where,copy),DEFVERBC("#",0,0,0,group,buckets),DEFVERB("_",0,X,0,nub,drop),DEFVERBD("_",0,X,0,unbits,unbase),DEFVERBC("_",X,X,X,bits,base),DEFVERB("?",0,0,0,unique,find),DEFVERB("&",0,X,X,flatten,minand),DEFVERB("|",0,X,X,reverse,maxor),DEFVERBD("|",X,X,0,round,rotate),DEFVERBC("|",0,X,0,depth,windows),DEFVERB("@",X,0,X,abs,at),DEFVERBD("@",0,0,0,shuffle,member),DEFVERBC("@",0,0,0,shuffle,indexof),DEFVERB("{",0,0,0,head,bin),DEFVERBD("{",0,0,0,tail,cut),DEFVERBC("{",0,X,X,prefixes,shl),DEFVERB("}",0,X,X,behead,xor),DEFVERBD("}",0,0,0,curtail,band),DEFVERBC("}",0,X,X,suffixes,shr),DEFVERB("[",X,0,0,factors,left),DEFVERBD("[",X,X,X,bnot,bor),DEFVERBC("[",X,X,0,primes,parts),DEFVERB("]",0,0,0,same,right),DEFVERBD("]",0,X,X,sort,outof),DEFVERBC("]",0,0,0,unsort,explode),DEFVERBD("`",0,0,0,symbol,apply1),DEFVERBC("`",0,0,0,square,apply2),DEFVERB("$",0,0,0,shape,reshape),DEFVERBD("$",0,0,0,repr,format),DEFVERBC("$",X,0,0,eye,implode),DEFVERBD("p",0,0,0,print,udf2),DEFVERBD("P",0,0,0,println,udf2),DEFVERBD("f",0,0,0,selfref1,selfref2),DEFVERBD("F",0,0,0,read,write),DEFVERBD("r",0,X,X,deal,roll),DEFVERBD("t",0,0,0,type,cast),DEFVERBD("E",0,0,0,exit,udf2),DEFVERBD("y",0,0,0,system,system2),DEFVERBD("e",0,0,0,eval,udf2),DEFVERBD("i",0,0,0,import,udf2),DEFVERBD("L",0,0,0,udf1,tackleft),DEFVERBD("R",0,0,0,udf1,tackright)};
  1718. Vt*_advfold_m(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R x;
  1719. Vt*_v=self->bonds->data[0];
  1720. if(_v->tag!=VERB)R st->udf;
  1721. vt*v=_v->val.verb;
  1722. Vt*t=xad[0];
  1723. Ar*tx=xa;
  1724. for(Z i=1;i<tx->length;i++)t=tgth(st,v,t,tx->data[i],0,0,v->rank[1],v->rank[2]);R t;}
  1725. Vt*_advfold_d(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||!yad)R y;
  1726. Vt*_v=self->bonds->data[0];
  1727. if(_v->tag!=VERB)R st->udf;
  1728. vt*v=_v->val.verb;
  1729. Vt*t=x;
  1730. Ar*ty=ya;
  1731. for(Z i=0;i<ty->length;i++)t=tgth(st,v,t,ty->data[i],0,0,v->rank[1],v->rank[2]);R t;}
  1732. Vt*_advscan_m(St*st,vt*self,Vt*x){if(xt!=ARRAY||!xad)R x;
  1733. Vt*_v=self->bonds->data[0];
  1734. if(_v->tag!=VERB)R st->udf;
  1735. vt*v=_v->val.verb;
  1736. Ar*r=An();
  1737. Vt*t=xad[0];
  1738. Ar*tx=xa;
  1739. Ap(r,t);
  1740. for(Z i=1;i<tx->length;i++){t=tgth(st,v,t,tx->data[i],0,0,v->rank[1],v->rank[2]);
  1741. Ap(r,t);}
  1742. R Vna(r);}
  1743. Vt*_advscan_d(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||!yad)R y;
  1744. Vt*_v=self->bonds->data[0];
  1745. if(_v->tag!=VERB)R st->udf;
  1746. vt*v=_v->val.verb;
  1747. Ar*r=An();
  1748. Vt*t=x;
  1749. Ar*ty=ya;
  1750. Ap(r,t);
  1751. for(Z i=1;i<ty->length;i++){t=tgth(st,v,t,ty->data[i],0,0,v->rank[1],v->rank[2]);
  1752. Ap(r,t);}
  1753. R Vna(r);}
  1754. Vt*_adveach_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1755. if(_v->tag!=VERB)R st->udf;
  1756. vt*v=_v->val.verb;
  1757. if(xt!=ARRAY)R eR(st,v,x,0,1);
  1758. if(!xad)R x;R eR(st,v,x,0,1);}
  1759. Vt*_adveach_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1760. if(_v->tag!=VERB)R st->udf;
  1761. vt*v=_v->val.verb;
  1762. if(xt!=ARRAY)x=venlist(st,N,x);
  1763. if(yt!=ARRAY)y=venlist(st,N,y);
  1764. Ar*r=An();
  1765. Ar*tx=xa;
  1766. Ar*ty=ya;
  1767. for(Z i=0;i<tx->length&&i<ty->length;i++)Ap(r,tgth(st,v,tx->data[i],ty->data[i],0,0,v->rank[1],v->rank[2]));R Vna(r);}
  1768. Vt*_advconverge_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1769. if(_v->tag!=VERB)R st->udf;
  1770. vt*v=_v->val.verb;
  1771. Vt*t;
  1772. LOOP{t=x;
  1773. x=eR(st,v,x,0,v->rank[0]);
  1774. if(Veq(x,t))BR;}
  1775. R x;}
  1776. vt*cnjbond(St*st,Vt*x,Vt*y);
  1777. Vt*_advconverge_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1778. if(_v->tag!=VERB)R st->udf;
  1779. vt*v=_v->val.verb;
  1780. if(yt!=ARRAY)R tgth(st,v,y,x,0,0,v->rank[1],v->rank[2]);
  1781. if(!yad)R x;
  1782. v=cnjbond(st,Vnv(v),x);R eR(st,v,y,0,1);}
  1783. Vt*_advconverges_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1784. if(_v->tag!=VERB)R st->udf;
  1785. Ar*r=An();
  1786. Vt*t;
  1787. Ap(r,x);
  1788. LOOP{t=x;
  1789. x=apM(st,_v,x);
  1790. if(Veq(x,t))BR;
  1791. Ap(r,x);}
  1792. R Vna(r);}
  1793. Vt*_advconverges_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1794. if(_v->tag!=VERB)R st->udf;
  1795. vt*v=_v->val.verb;
  1796. if(yt!=ARRAY)R tgth(st,v,y,x,0,0,v->rank[1],v->rank[2]);
  1797. if(!yad)R x;
  1798. v=cnjbond(st,x,Vnv(v));R eR(st,v,y,0,1);}
  1799. Vt*_adveachprior_m(St*st,vt*self,Vt*x){if(xt!=ARRAY||xal<2)R x;
  1800. Vt*_v=self->bonds->data[0];
  1801. if(_v->tag!=VERB)R st->udf;
  1802. vt*v=_v->val.verb;
  1803. Ar*r=An();
  1804. for(Z i=1;i<xal;i++)Ap(r,tgth(st,v,xad[i],xad[i-1],0,0,v->rank[1],v->rank[2]));R Vna(r);}
  1805. Vt*_adveachprior_d(St*st,vt*self,Vt*x,Vt*y){if(yt!=ARRAY||!yad)R y;
  1806. Vt*_v=self->bonds->data[0];
  1807. if(_v->tag!=VERB)R st->udf;
  1808. vt*v=_v->val.verb;
  1809. Ar*r=An();
  1810. for(Z i=0;i<yal;i++)Ap(r,tgth(st,v,yad[i],i==0?x:yad[i-1],0,0,v->rank[1],v->rank[2]));R Vna(r);}
  1811. Vt*_advreflex_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1812. if(_v->tag!=VERB)R st->udf;
  1813. vt*v=_v->val.verb;R tgth(st,v,x,x,0,0,v->rank[1],v->rank[2]);}
  1814. Vt*_advreflex_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1815. if(_v->tag!=VERB)R st->udf;
  1816. vt*v=_v->val.verb;R tgth(st,v,y,x,0,0,v->rank[1],v->rank[2]);}
  1817. Vt*_advamend_m(St*st,vt*self,Vt*x){R st->udf;}
  1818. Vt*_advamend_d(St*st,vt*self,Vt*x,Vt*y){if(xt!=ARRAY)x=venlist(st,N,x);
  1819. Vt*v=self->bonds->data[0];
  1820. if(v->tag!=ARRAY)v=venlist(st,N,v);
  1821. if(yt!=ARRAY)y=venlist(st,N,y);
  1822. Ar*r=Ac(ya);
  1823. Z l=xal;
  1824. Ar*t=v->val.array;
  1825. for(Z i=0;i<t->length;i++){Vt*n=t->data[i];
  1826. if(n->tag!=NUM)BR;
  1827. As(r,n->val.number,Ai(xa,i<l?i:l-1));}
  1828. R Vna(r);}
  1829. Vt*_advfilter_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1830. if(_v->tag!=VERB)R st->udf;
  1831. if(xt!=ARRAY)x=venlist(st,N,x);
  1832. elif(!xad)R x;
  1833. vt*v=_v->val.verb;
  1834. Ar*r=An();
  1835. for(Z i=0;i<xal;i++){Vt*b=eR(st,v,xad[i],0,v->rank[0]);
  1836. if(VTp(b))Ap(r,xad[i]);}
  1837. R Vna(r);}
  1838. Vt*_advfilter_d(St*st,vt*self,Vt*x,Vt*y){R st->udf;}
  1839. Vt*_advspan_m(St*st,vt*self,Vt*x){Vt*v=self->bonds->data[0];
  1840. if(v->tag!=VERB)R st->udf;
  1841. if(xt!=ARRAY)x=venlist(st,N,x);
  1842. elif(!xad)R x;
  1843. Ar*r=An();
  1844. Ar*p=An();
  1845. for(Z i=0;i<xal;i++){Vt*b=apM(st,v,xad[i]);
  1846. if(VTp(b)){Ap(r,Vna(p));
  1847. p=An();}else Ap(p,xad[i]);}
  1848. Ap(r,Vna(p));R Vna(r);}
  1849. Vt*_advspan_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1850. if(_v->tag!=VERB)R st->udf;
  1851. vt*v=_v->val.verb;
  1852. Vt*r=vwindows(st,N,x,y);R eR(st,v,r,0,1);}
  1853. Vt*_advinverse_m(St*st,vt*self,Vt*x){Vt*_v=self->bonds->data[0];
  1854. if(_v->tag!=VERB)R st->udf;
  1855. vt*v=_v->val.verb;
  1856. vt*iv=Tget(Inverses,v->name);
  1857. if(!iv)R st->udf;R eR(st,iv,x,0,iv->rank[0]);}
  1858. Vt*_advinverse_d(St*st,vt*self,Vt*x,Vt*y){Vt*_v=self->bonds->data[0];
  1859. if(_v->tag!=VERB)R st->udf;
  1860. vt*v=_v->val.verb;
  1861. vt*iv=Tget(Inverses,v->name);
  1862. if(!iv)R st->udf;
  1863. Vt*a=eR(st,iv,x,0,iv->rank[0]);
  1864. Vt*b=eR(st,iv,y,0,iv->rank[0]);R apD(st,_v,a,b);}
  1865. #define ADVERB(__name,__symb)\
  1866. vt*adv##__name(St*st,Vt*v){\
  1867. vt*nv=vnew();\
  1868. nv->bonds=Ank(1);\
  1869. nv->bonds->data[0]=v;\
  1870. S r=Vshow(v);\
  1871. Z l=strlen(r)+strlen(__symb)+1;\
  1872. nv->name=ma(l);\
  1873. snprintf(nv->name,l,"%s" __symb,r);\
  1874. FR(r);\
  1875. nv->rank[0]=0;\
  1876. nv->monad=_adv##__name##_m;\
  1877. nv->dyad=_adv##__name##_d;\
  1878. R nv;}
  1879. ADVERB(fold,"/");
  1880. ADVERB(converge,"/.");
  1881. ADVERB(scan,"\\");
  1882. ADVERB(converges,"\\.");
  1883. ADVERB(each,"\"");
  1884. ADVERB(eachprior,"\".");
  1885. ADVERB(reflex,";.");
  1886. ADVERB(amend,"`");
  1887. ADVERB(filter,"&.");
  1888. ADVERB(span,"/:");
  1889. ADVERB(inverse,"-:");
  1890. advt ADVERBS[]={{"/",advfold,N}, {"/.",advconverge,N},{"\\",advscan,N}, {"\\.",advconverges,N},{"\"",adveach,N}, {"\".",adveachprior,N},{";.",advreflex,N},{"`",advamend,N},{"&.",advfilter,N},{"/:",advspan,N},{"-:",advinverse,N}};
  1891. Vt*_cnjbond_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1892. Vt*v2=self->bonds->data[1];
  1893. if(v1->tag==VERB&&v2->tag==VERB)R apM(st,v1,apM(st,v2,x));
  1894. elif(v1->tag==VERB)R apD(st,v1,x,v2);
  1895. elif(v2->tag==VERB)R apD(st,v2,v1,x);
  1896. else R st->nil;}
  1897. Vt*_cnjbond_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1898. Vt*v2=self->bonds->data[1];
  1899. if(v1->tag==VERB&&v2->tag==VERB)R apM(st,v1,apD(st,v2,x,y));
  1900. elif(v1->tag==VERB)R apD(st,v1,apD(st,v1,x,y),v2);
  1901. elif(v2->tag==VERB)R apD(st,v2,v1,apD(st,v2,x,y));
  1902. else R st->nil;}
  1903. Vt*_cnjpick_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1904. Vt*v2=self->bonds->data[1];
  1905. if(v1->tag!=VERB||v2->tag!=ARRAY)R st->nil;
  1906. Vt*n=apM(st,v1,x);
  1907. Vt*f=vat(st,N,v2,n);R apM(st,f,x);}
  1908. Vt*_cnjpick_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1909. Vt*v2=self->bonds->data[1];
  1910. if(v1->tag!=VERB||v2->tag!=ARRAY)R st->nil;
  1911. Vt*n=apD(st,v1,x,y);
  1912. Vt*f=vat(st,N,v2,n);R apD(st,f,x,y);}
  1913. Vt*_cnjwhile_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1914. Vt*v2=self->bonds->data[1];
  1915. if(v1->tag==VERB){LOOP{if(!VTp(apM(st,v1,x)))BR;
  1916. x=apM(st,v2,x);}}elif(v1->tag==NUM){Z k=(Z)fabs(v1->val.number);
  1917. for(Z i=0;i<k;i++)x=apM(st,v2,x);}
  1918. R x;}
  1919. Vt*_cnjwhile_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1920. Vt*v2=self->bonds->data[1];
  1921. if(v1->tag==VERB){LOOP{if(!VTp(apD(st,v1,x,y)))BR;
  1922. x=apD(st,v2,x,y);}}elif(v1->tag==NUM){Z k=(Z)fabs(v1->val.number);
  1923. for(Z i=0;i<k;i++)x=apD(st,v2,x,y);}
  1924. R x;}
  1925. Vt*_cnjrank_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1926. Vt*v2=self->bonds->data[1];
  1927. if(v1->tag!=VERB||v2->tag!=NUM)R st->udf;
  1928. UI rank=
  1929. v2->val.number==INFINITY?UINT_MAX:fabs(v2->val.number);R eR(st,v1->val.verb,x,0,rank);}
  1930. Vt*_cnjrank_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1931. Vt*v2=self->bonds->data[1];
  1932. if(v1->tag!=VERB)R st->udf;
  1933. UI rl;
  1934. UI rr;
  1935. if(v2->tag==NUM)rl=rr=v2->val.number==INFINITY?UINT_MAX:fabs(v2->val.number);
  1936. elif(v2->tag==ARRAY&&v2->val.array->length==2){Vt*a=v2->val.array->data[0];
  1937. Vt*b=v2->val.array->data[1];
  1938. if(a->tag!=NUM)R st->udf;
  1939. rl=a->val.number==INFINITY?UINT_MAX:fabs(a->val.number);
  1940. if(b->tag!=NUM)R st->udf;
  1941. rr=b->val.number==INFINITY?UINT_MAX:fabs(b->val.number);}
  1942. else R st->udf;R tgth(st,v1->val.verb,x,y,0,0,rl,rr);}
  1943. Vt*_cnjmonaddyad_m(St*st,vt*self,Vt*x){Vt*v=self->bonds->data[0];
  1944. if(v->tag!=VERB)R st->udf;R eR(st,v->val.verb,x,0,v->val.verb->rank[0]);}
  1945. Vt*_cnjmonaddyad_d(St*st,vt*self,Vt*x,Vt*y){Vt*v=self->bonds->data[1];
  1946. if(v->tag!=VERB)R st->udf;R tgth(st,v->val.verb,x,y,0,0,v->val.verb->rank[1],v->val.verb->rank[2]);}
  1947. Vt*_cnjif_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1948. Vt*v2=self->bonds->data[1];
  1949. if(v1->tag!=VERB||v2->tag!=VERB)R st->udf;
  1950. Vt*b=apM(st,v2,x);
  1951. if(VTp(b))R x;R apM(st,v1,x);}
  1952. Vt*_cnjif_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1953. Vt*v2=self->bonds->data[1];
  1954. if(v1->tag!=VERB||v2->tag!=VERB)R st->udf;
  1955. Vt*b=apD(st,v2,x,y);
  1956. if(VTp(b))R y;R apD(st,v1,x,y);}
  1957. Vt*_cnjunder_m(St*st,vt*self,Vt*x){Vt*v1=self->bonds->data[0];
  1958. Vt*v2=self->bonds->data[1];
  1959. if(v1->tag!=VERB||v2->tag!=VERB)R st->udf;
  1960. vt*iv=Tget(Inverses,v2->val.verb->name);
  1961. if(!iv)R st->udf;
  1962. Vt*v=apM(st,v2,x);
  1963. v=apM(st,v1,v);R eR(st,iv,v,0,iv->rank[0]);}
  1964. Vt*_cnjunder_d(St*st,vt*self,Vt*x,Vt*y){Vt*v1=self->bonds->data[0];
  1965. Vt*v2=self->bonds->data[1];
  1966. if(v1->tag!=VERB||v2->tag!=VERB)R st->udf;
  1967. vt*iv=Tget(Inverses,v2->val.verb->name);
  1968. if(!iv)R st->udf;
  1969. Vt*a=apM(st,v2,x);
  1970. Vt*b=apM(st,v2,y);
  1971. Vt*v=apD(st,v1,a,b);R eR(st,iv,v,0,iv->rank[0]);}
  1972. #define CONJUNCTION(__name,__symb)\
  1973. vt*cnj##__name(St*st,Vt*x,Vt*y){\
  1974. vt*nv=vnew();\
  1975. nv->bonds=Ank(2);\
  1976. nv->bonds->data[0]=x;\
  1977. nv->bonds->data[1]=y;\
  1978. S rx=Vshow(x);\
  1979. S ry=Vshow(y);\
  1980. Z l=strlen(rx)+strlen(ry)+strlen(__symb)+1;\
  1981. nv->name=ma(l);\
  1982. snprintf(nv->name,l,"%s"__symb"%s",rx,ry);\
  1983. FR(rx);\
  1984. FR(ry);\
  1985. nv->rank[0]=0;\
  1986. nv->rank[1]=0;\
  1987. nv->rank[1]=0;\
  1988. nv->monad=_cnj##__name##_m;\
  1989. nv->dyad=_cnj##__name##_d;\
  1990. R nv;}
  1991. CONJUNCTION(bond,";");
  1992. CONJUNCTION(pick,"?.");
  1993. CONJUNCTION(while,"?:");
  1994. CONJUNCTION(rank,"\":");
  1995. CONJUNCTION(monaddyad,";:");
  1996. CONJUNCTION(if,"&:");
  1997. CONJUNCTION(under,"^:");
  1998. advt CONJUNCTIONS[]={{";",N,cnjbond},{"?.",N,cnjpick},{"?:",N,cnjwhile},{"\":",N,cnjrank},{";:",N,cnjmonaddyad},{"&:",N,cnjif},{"^:",N,cnjunder}};
  1999. #define FINDER(kind,rname,table)\
  2000. kind*G##rname(S s){\
  2001. for(Z i=0;i<AE(table);i++){\
  2002. if(strcmp(table[i].name,s)==0)\
  2003. R &table[i];}\
  2004. R N;}
  2005. FINDER(vt,v,VERBS);
  2006. FINDER(advt,adv,ADVERBS);
  2007. FINDER(advt,cnj,CONJUNCTIONS);
  2008. Nt*Nn(enum Ntag_t tag){Nt*node=ma(SO(Nt));
  2009. node->tag=tag;R node;}
  2010. Nt*Nns(Ar*l){Nt*node=ma(SO(Nt));
  2011. node->tag=N_STRAND;
  2012. node->l=l;R node;}
  2013. Nt*Nnl(Vt*v){Nt*node=ma(SO(Nt));
  2014. node->tag=N_LITERAL;
  2015. node->v=v;R node;}
  2016. Nt*Nn1(enum Ntag_t tag,Nt*a){Nt*node=ma(SO(Nt));
  2017. node->tag=tag;
  2018. node->a=a;R node;}
  2019. Nt*Nn2(enum Ntag_t tag,Nt*a,Nt*b){Nt*node=ma(SO(Nt));
  2020. node->tag=tag;
  2021. node->a=a;
  2022. node->b=b;R node;}
  2023. Nt*Nn3(enum Ntag_t tag,Nt*a,Nt*b,Nt*c){Nt*node=ma(SO(Nt));
  2024. node->tag=tag;
  2025. node->a=a;
  2026. node->b=b;
  2027. node->c=c;R node;}
  2028. typedef struct{Lt*lexer;
  2029. St*st;
  2030. Z pos;
  2031. Z end;}Pt;
  2032. Pt*Pnew(St*state){Pt*parser=ma(SO(Pt));
  2033. parser->st=state;R parser;}
  2034. V Perror(Pt*parser,S s){fatal(s);}
  2035. B Pdone(Pt*parser){R parser->pos>=parser->end;}
  2036. Tkt*Plook(Pt*parser,Z offset){Z pos=parser->pos+offset;
  2037. if(pos>=parser->end)R N;R Ai(parser->lexer->tokens,pos);}
  2038. B Pstop(Pt*parser){Tkt*tok=Plook(parser,0);
  2039. if(!tok)R T;R tok->tag==T_RPAR;}
  2040. V Peat(Pt*parser){if(!Pdone(parser))parser->pos++;}
  2041. Nt*PPexpr(Pt*parser);
  2042. Nt*PPverb(Pt*parser){Tkt*tok=Plook(parser,0);
  2043. if(!tok||tok->tag!=T_PUNCT)R N;
  2044. vt*verb=Gv(tok->text);
  2045. if(!verb)R N;R Nnl(Vnv(verb));}
  2046. Vt*_advwrapper_m(St*st,vt*self,Vt*x){advt*av=self->bonds->data[0];
  2047. if(xt!=VERB)R st->udf;R Vnv(av->adverb(st,x));}
  2048. Vt*_advwrapper_d(St*st,vt*self,Vt*x,Vt*y){advt*av=self->bonds->data[0];
  2049. if(xt!=VERB)R st->udf;
  2050. vt*v=av->adverb(st,x);R eR(st,v,y,0,v->rank[0]);}
  2051. Nt*PPadvatom(Pt*parser){Tkt*tok=Plook(parser,0);
  2052. if(!tok||tok->tag!=T_PUNCT)R N;
  2053. advt*adverb=Gadv(tok->text);
  2054. if(!adverb)R N;
  2055. vt*nv=vnew();
  2056. nv->name=sdup(tok->text);
  2057. nv->bonds=Ank(1);
  2058. nv->bonds->data[0]=adverb;
  2059. nv->rank[0]=0;
  2060. nv->rank[1]=0;
  2061. nv->rank[2]=0;
  2062. nv->monad=_advwrapper_m;
  2063. nv->dyad=_advwrapper_d;R Nnl(Vnv(nv));}
  2064. Vt*_cnjwrapper_d(St*st,vt*self,Vt*x,Vt*y){advt*av=self->bonds->data[0];R Vnv(av->conjunction(st,x,y));}
  2065. Nt*PPcnjatom(Pt*parser){Tkt*tok=Plook(parser,0);
  2066. if(!tok||tok->tag!=T_PUNCT)R N;
  2067. advt*adverb=Gcnj(tok->text);
  2068. if(!adverb)R N;
  2069. vt*nv=vnew();
  2070. nv->name=sdup(tok->text);
  2071. nv->bonds=Ank(1);
  2072. nv->bonds->data[0]=adverb;
  2073. nv->rank[0]=0;
  2074. nv->rank[1]=0;
  2075. nv->rank[2]=0;
  2076. nv->monad=N;
  2077. nv->dyad=_cnjwrapper_d;R Nnl(Vnv(nv));}
  2078. Nt*PPatom(Pt*parser){Tkt*tok=Plook(parser,0);
  2079. Nt*node=N;
  2080. SW(tok->tag){CS T_RPAR:Perror(parser,"unmatched");
  2081. CS T_LPAR:Peat(parser);
  2082. tok=Plook(parser,0);
  2083. if(tok&&tok->tag==T_RPAR){node=Nnl(parser->st->unit);BR;}
  2084. node=PPexpr(parser);
  2085. tok=Plook(parser,0);
  2086. if(!tok||tok->tag!=T_RPAR)Perror(parser,"unmatched");BR;
  2087. CS T_PUNCT:node=PPverb(parser);
  2088. if(!node)node=PPadvatom(parser);
  2089. if(!node)node=PPcnjatom(parser);
  2090. if(!node)Perror(parser,"parse");BR;
  2091. CS T_NUM:node=Nnl(Vnn(strtod(tok->text,N)));BR;
  2092. CS T_NAME:node=Nnl(Vny(sdup(tok->text)));BR;
  2093. CS T_QUOTE:if(!*tok->text)node=Nnl(parser->st->unit);
  2094. elif(!*(tok->text+1))node=Nnl(Vnc(tok->text[0]));
  2095. else{Z z=strlen(tok->text);
  2096. Ar*r=Ank(z);
  2097. for(Z i=0;i<z;i++)r->data[i]=CHARS[tok->text[i]];
  2098. node=Nnl(Vna(r));}BR;}
  2099. if(!node)Perror(parser,"parse");
  2100. Peat(parser);R node;}
  2101. Nt*PPa(Pt*parser,Nt*a,enum Tkt tag){Tkt*tok;
  2102. if((tok=Plook(parser,0))&&tok->tag==tag){Ar*as=An();
  2103. Ap(as,a->v);
  2104. do{a=PPatom(parser);
  2105. Ap(as,a->v);}WH((tok=Plook(parser,0))&&tok->tag==tag);R Nnl(Vna(as));}
  2106. R N;}
  2107. Nt*_PPnoun(Pt*parser){Nt*n;
  2108. Nt*a=PPatom(parser);
  2109. if(a->tag==N_LITERAL&&a->v->tag==NUM&&(n=PPa(parser,a,T_NUM)))R n;
  2110. elif(a->tag==N_LITERAL&&a->v->tag==SYM&&(n=PPa(parser,a,T_NAME)))R n;
  2111. elif(a->tag==N_LITERAL&&a->v->tag==ARRAY&&Cap(a->v->val.array)&&(n=PPa(parser,a,T_QUOTE)))R n;R a;}
  2112. Nt*PPnoun(Pt*parser,B flat){Nt*a=flat?PPatom(parser):_PPnoun(parser);
  2113. Tkt*tok;
  2114. if((tok=Plook(parser,0))&&tok->tag==T_PUNCT&&strcmp(tok->text,",:")==0){Peat(parser);
  2115. Ar*l=An();
  2116. Ap(l,a);
  2117. LOOP{if(Pstop(parser))Perror(parser,"trailing-strand");
  2118. a=flat?PPatom(parser):_PPnoun(parser);
  2119. Ap(l,a);
  2120. if(!((tok=Plook(parser,0))&&tok->tag==T_PUNCT&&strcmp(tok->text,",:")==0))BR;
  2121. Peat(parser);}
  2122. R Nns(l);}
  2123. R a;}
  2124. B Nisv(Pt*parser,Nt*n){Vt*v;
  2125. if(n->tag==N_FUN)R T;
  2126. elif(n->tag==N_ADV||n->tag==N_CONJ||n->tag==N_PARTIAL_CONJ)R T;
  2127. elif(n->tag==N_FORK||n->tag==N_HOOK||n->tag==N_BOND||n->tag==N_OVER)R T;
  2128. elif(n->tag==N_LITERAL&&n->v->tag==VERB)R T;
  2129. elif(n->tag==N_LITERAL&&n->v->tag==SYM&&(v=Tget(parser->st->env,n->v->val.symbol))&&v->tag==VERB)R T;R F;}
  2130. Nt*PPadv(Pt*parser,Nt*v,bool*flag){Tkt*tok;
  2131. advt*adv;
  2132. Nt*t;
  2133. LOOP{tok=Plook(parser,0);
  2134. if(!tok||tok->tag!=T_PUNCT)BR;
  2135. if((adv=Gadv(tok->text))){if(flag)*flag=T;
  2136. Peat(parser);
  2137. t=Nn(N_ADV);
  2138. t->av=adv;
  2139. t->a=v;
  2140. v=t;}else BR;}
  2141. R v;}
  2142. Nt*PPcnj(Pt*parser,Nt*v,bool*flag){Tkt*tok;
  2143. advt*adv;
  2144. Nt*t;
  2145. LOOP{tok=Plook(parser,0);
  2146. if(!tok||tok->tag!=T_PUNCT)BR;
  2147. if((adv=Gcnj(tok->text))){if(flag)*flag=T;
  2148. Peat(parser);
  2149. if(Pstop(parser)){t=Nn(N_PARTIAL_CONJ);
  2150. t->av=adv;
  2151. t->a=v;}else{t=Nn(N_CONJ);
  2152. t->av=adv;
  2153. t->a=v;
  2154. t->b=PPnoun(parser,T);}
  2155. v=t;}else BR;}
  2156. R v;}
  2157. B is_apply(Nt*n){R n->tag==N_LITERAL&&n->v->tag==VERB&&(strcmp(n->v->val.verb->name,"`.")==0||strcmp(n->v->val.verb->name,"`:")==0);}
  2158. B is_obverse(Nt*n){R n->tag==N_LITERAL&&n->v->tag==VERB&&strcmp(n->v->val.verb->name,"::")==0;}
  2159. Nt*PPexpr(Pt*parser){Tkt*tmp;
  2160. Ar*ns=An();
  2161. WH(!Pstop(parser)){if(!ns->data&&(tmp=Plook(parser,0))&&tmp->tag==T_PUNCT&&strcmp(tmp->text,":")==0&&(Plook(parser,1))){Peat(parser);R Nn1(N_FUN,PPexpr(parser));}
  2162. Nt*n=PPnoun(parser,F);
  2163. if(!ns->data&&n->tag==N_LITERAL&&n->v->tag==SYM&&(tmp=Plook(parser,0))&&tmp->tag==T_PUNCT&&strcmp(tmp->text,":")==0){Peat(parser);R Nn2(N_BIND,n,PPexpr(parser));}
  2164. LOOP{B flag=F;
  2165. n=PPadv(parser,n,&flag);
  2166. n=PPcnj(parser,n,&flag);
  2167. if(!flag)BR;}
  2168. Ap(ns,n);}
  2169. Z len;
  2170. Nt*l,*m,*r;
  2171. LOOP{len=ns->length;
  2172. if(len<2)BR;
  2173. if(len>=3&&(is_apply(Ai(ns,-2))||is_obverse(Ai(ns,-2)))&&Nisv(parser,Ai(ns,-1))){r=AP(ns);
  2174. m=AP(ns);
  2175. l=AP(ns);
  2176. Ap(ns,Nn3(N_DYAD,m,l,r));}elif(len>=3&&!Nisv(parser,Ai(ns,-1))&&Nisv(parser,Ai(ns,-2))&&!Nisv(parser,Ai(ns,-3))){r=AP(ns);
  2177. m=AP(ns);
  2178. l=AP(ns);
  2179. Ap(ns,Nn3(N_DYAD,m,l,r));}elif(len>=3&&Nisv(parser,Ai(ns,-1))&&Nisv(parser,Ai(ns,-2))&&Nisv(parser,Ai(ns,-3))){r=AP(ns);
  2180. m=AP(ns);
  2181. l=AP(ns);
  2182. Ap(ns,Nn3(N_FORK,l,m,r));}elif(len>=3&&Nisv(parser,Ai(ns,-1))&&Nisv(parser,Ai(ns,-2))&&!Nisv(parser,Ai(ns,-3))){r=AP(ns);
  2183. m=AP(ns);
  2184. l=AP(ns);
  2185. Ap(ns,Nn3(N_OVER,l,m,r));}elif(len>=2&&is_apply(Ai(ns,-1))){r=AP(ns);
  2186. l=AP(ns);
  2187. Ap(ns,Nn2(N_BOND,r,l));}elif(len>=2&&!Nisv(parser,Ai(ns,-1))&&Nisv(parser,Ai(ns,-2))){r=AP(ns);
  2188. l=AP(ns);
  2189. Ap(ns,Nn2(N_MONAD,l,r));}elif(len>=2&&Nisv(parser,Ai(ns,-1))&&Nisv(parser,Ai(ns,-2))){r=AP(ns);
  2190. l=AP(ns);
  2191. Ap(ns,Nn2(N_HOOK,l,r));}elif(len>=2&&Nisv(parser,Ai(ns,-1))&&!Nisv(parser,Ai(ns,-2))){r=AP(ns);
  2192. l=AP(ns);
  2193. Ap(ns,Nn2(N_BOND,r,l));}elif(len>=3){r=AP(ns);
  2194. m=AP(ns);
  2195. l=AP(ns);
  2196. Ap(ns,Nn3(N_INDEX2,m,l,r));}elif(len>=2){r=AP(ns);
  2197. l=AP(ns);
  2198. Ap(ns,Nn2(N_INDEX1,l,r));}}
  2199. R ns->data?ns->data[0]:N;}
  2200. Nt*Pparse(Pt*parser,Lt*lexer){parser->lexer=lexer;
  2201. parser->pos=0;
  2202. parser->end=parser->lexer->tokens->length;
  2203. Nt*node=PPexpr(parser);
  2204. if(!Pdone(parser)){Tkt*tok=Plook(parser,0);
  2205. if(tok&&tok->tag==T_RPAR)Perror(parser,"unmatched");
  2206. Perror(parser,"parse");}
  2207. R node;}
  2208. Vt*Srun(St*st,S program){Lt*lexer=Lnew();
  2209. Llex(lexer,program);
  2210. Pt*parser=Pnew(st);
  2211. Nt*node=Pparse(parser,lexer);
  2212. Ar*t=lexer->tokens;
  2213. for(Z i=0;i<t->length;i++){Tkt*tok=t->data[i];
  2214. if(tok->text)FR(tok->text);
  2215. FR(tok);}
  2216. FR(t->data);
  2217. FR(t);
  2218. Vt*r=Swalk(st,node);
  2219. FR(parser);R r;}
  2220. cS VHELP =\
  2221. ": monadic const create a function that always yields x" "\n"\
  2222. ": dyadic bind bind y to symbol x" "\n"\
  2223. ":: monadic unbind unbind symbol x" "\n"\
  2224. ":: dyadic obverse insert inverse for x" "\n"\
  2225. "+ monadic flip transpose matrix" "\n"\
  2226. "+ dyadic plus add numbers" "\n"\
  2227. "+. monadic fibonacci compute xth fibonacci number" "\n"\
  2228. "+. dyadic gcd compute gcd(x, y)" "\n"\
  2229. "+: monadic sin compute sin(x)" "\n"\
  2230. "+: dyadic combine combine digits of x and y, same as 10_.(10_:),(10_:)" "\n"\
  2231. "- monadic negate negate number" "\n"\
  2232. "- dyadic minus subtract numbers" "\n"\
  2233. "* monadic first yield first element of x" "\n"\
  2234. "* dyadic times multiply numbers" "\n"\
  2235. "*. monadic factorial x!" "\n"\
  2236. "*. dyadic lcm compute lcm(x, y)" "\n"\
  2237. "*: monadic double x * 2" "\n"\
  2238. "*: dyadic replicate repeat y x times" "\n"\
  2239. "% monadic reciprocal 1 / x" "\n"\
  2240. "% dyadic divide divide numbers" "\n"\
  2241. "%. monadic sqrt compute square root of x" "\n"\
  2242. "%. dyadic root compute xth root of y" "\n"\
  2243. "%: monadic halve x % 2" "\n"\
  2244. "%: dyadic idivide same as % divide, but result is always integer" "\n"\
  2245. "! monadic enum [0, x)" "\n"\
  2246. "! dyadic mod modulo of numbers" "\n"\
  2247. "!. monadic iota [1, x]" "\n"\
  2248. "!. dyadic range [x, y] (also works for chars and even if x > y)" "\n"\
  2249. "!: monadic odometer !:10 10 is 0 0,:0 1,: ... 1 0,:1 1,: ... 9 8,:9 9" "\n"\
  2250. "!: dyadic chunks split y into x-sized chunks" "\n"\
  2251. "^ monadic exp e^x" "\n"\
  2252. "^ dyadic power raise number to a power" "\n"\
  2253. "^. monadic nlog ln(x)" "\n"\
  2254. "^. dyadic log log(y)/log(x)" "\n"\
  2255. "= monadic permute generate permutations of x" "\n"\
  2256. "= dyadic equals test whether x and y are equal" "\n"\
  2257. "=. monadic occurences count occurences of elts, =.'Hello World!' is 0 0 0 1 0 0 0 1 0 2 0 0" "\n"\
  2258. "=. dyadic mask mask one array in another, 'abxyzabayxxyabxyk'=.'xy' is 0 0 1 1 0 0 0 0 0 0 2 2 0 0 3 3 0" "\n"\
  2259. "=: monadic classify assign unique index to each unique elt, =:'Hello World!' is 0 1 2 2 3 4 5 3 6 2 7 8" "\n"\
  2260. "=: dyadic match same as = equals, but rank 0, so compares x and y as whole" "\n"\
  2261. "~ monadic not logical not, nil udf () 0 4t.0 are not truthy, everything else is truthy" "\n"\
  2262. "~ dyadic notequals test whether x and y are not equal" "\n"\
  2263. "~. monadic sign sign of x, -1 for negative, 0 for 0, 1 for positive" "\n"\
  2264. "~. dyadic insert insert x between elts of y, 0~.1 2 3 is 1 0 2 0 3" "\n"\
  2265. "~: dyadic notmatch rank 0 version of ~ notequals" "\n"\
  2266. "< monadic pred x - 1" "\n"\
  2267. "< dyadic less test whether x is lesser than y" "\n"\
  2268. "<. monadic floor round x down" "\n"\
  2269. "<. dyadic lesseq test whether x is equal or lesser than y" "\n"\
  2270. "<: monadic gradedown indices of array sorted descending" "\n"\
  2271. "<: dyadic nudgeleft shift elts of y to the left filling gap with x" "\n"\
  2272. "> monadic succ x + 1" "\n"\
  2273. "> dyadic greater test whether x is greater than y" "\n"\
  2274. ">. monadic ceil round x up" "\n"\
  2275. ">. dyadic greatereq test whether x is equal or greater than y" "\n"\
  2276. ">: monadic gradeup indices of array sorted ascending" "\n"\
  2277. ">: dyadic nudgeright shift elts of y to the right filling gap with x" "\n"\
  2278. ", monadic enlist put x into 1-elt array" "\n"\
  2279. ", dyadic join concat x and y" "\n"\
  2280. ",. monadic enfile same as , enlist but with infinite rank, ,.1 2 3 is (,1),:(,2),:(,3)" "\n"\
  2281. ",. dyadic enpair put x and y into 2-elt array" "\n"\
  2282. "# monadic count yield count of elts of x" "\n"\
  2283. "# dyadic take take x first elts of y (or last if x < 0)" "\n"\
  2284. "#. monadic where #.0 0 1 0 1 0 is 2 4" "\n"\
  2285. "#. dyadic copy repeat each elt of x by corresponding number in y, 5 2 3 3#.0 2 2 1 is 2 2 3 3 3" "\n"\
  2286. "#: monadic group #:'mississippi' is (,0),:1 4 7 10,:2 3 5 6,:8 9" "\n"\
  2287. "#: dyadic buckets group elts of y into buckets according to x, e.g. 0 -1 -1 2 0#:a b c d e is (a,.e),:(),:(,d)" "\n"\
  2288. "_ monadic nub mark all unique elts of x, e.g. _'abracadabra' yields 1 1 1 0 1 0 1 0 0 0 0" "\n"\
  2289. "_ dyadic drop remove first x elts of y (or last if x < 0)" "\n"\
  2290. "_. monadic unbits _.1 0 1 is 5" "\n"\
  2291. "_. dyadic unbase 10_.4 5 6 is 456" "\n"\
  2292. "_: monadic bits _:5 is 1 0 1" "\n"\
  2293. "_: dyadic base 10_:4242 is 4 2 4 2" "\n"\
  2294. "? monadic unique distinct elts of x, same as ]#._" "\n"\
  2295. "? dyadic find find all indices of x in y" "\n"\
  2296. "& monadic flatten flatten an array, same as ,//." "\n"\
  2297. "& dyadic minand get min of two numbers (logical and for 0/1s)" "\n"\
  2298. "| monadic reverse reverse an array" "\n"\
  2299. "| dyadic maxor get max of two numbers (for 0/1s is same as logical or)" "\n"\
  2300. "|. monadic round round x" "\n"\
  2301. "|. dyadic rotate rotate array x times clockwise (-x for counterclockwise)" "\n"\
  2302. "|: monadic depth find max depth of x, |:,,,y yields 3" "\n"\
  2303. "|: dyadic windows yields all contiguous x-sized subarrays of y" "\n"\
  2304. "@ monadic abs |x|" "\n"\
  2305. "@ dyadic at pick elts from x by indices from y" "\n"\
  2306. "@. monadic shuffle shuffle elts of x" "\n"\
  2307. "@. dyadic member check whether x is in y" "\n"\
  2308. "@: dyadic indexof yield index of x in y or #y if x not in y" "\n"\
  2309. "{ monadic head first two elts of x, same as 2#" "\n"\
  2310. "{ dyadic bin bin search, e.g. 1 3 5 7 9{8 9 0 yields 3 4 -1" "\n"\
  2311. "{. monadic tail last elt of x" "\n"\
  2312. "{: monadic prefixes prefixes of x, same as |}.\\." "\n"\
  2313. "{: dyadic shl x << y" "\n"\
  2314. "} monadic behead all elts of x except first, same as 1_" "\n"\
  2315. "} dyadic xor x ^ y" "\n"\
  2316. "}. monadic curtail all elts of x except last, same as -1_" "\n"\
  2317. "}: monadic suffixes suffixes of x, same as }.\\." "\n"\
  2318. "}: dyadic shr x >> y" "\n"\
  2319. "[ monadic factors compute prime factors of x" "\n"\
  2320. "[ dyadic left yield x" "\n"\
  2321. "[. monadic bnot ~x" "\n"\
  2322. "[. dyadic bor x | y" "\n"\
  2323. "[: monadic primes find primes in range [2, x]" "\n"\
  2324. "[: dyadic parts split y into x parts" "\n"\
  2325. "] monadic same yield x (i.e. identity)" "\n"\
  2326. "] dyadic right yield y (i.e. right argument)" "\n"\
  2327. "]. monadic sort sort x ascending, shortcut for ]@>:" "\n"\
  2328. "]. dyadic outof the number of ways of picking x balls from a bag of y balls, e.g. 5].10 is 252" "\n"\
  2329. "]: monadic unsort sort x descending, shortcut for ]@<:" "\n"\
  2330. "]: dyadic explode split y by delim x" "\n"\
  2331. "`. monadic symbol cast x to a symbol" "\n"\
  2332. "`. dyadic apply1 apply x to y" "\n"\
  2333. "`: monadic square x ^ 2" "\n"\
  2334. "`: dyadic apply2 apply x to y (y is 2-elt array of args)" "\n"\
  2335. "$ monadic shape yield shape of x" "\n"\
  2336. "$ dyadic reshape reshape y to shape x" "\n"\
  2337. "$. monadic repr yield string repr of x" "\n"\
  2338. "$. dyadic format format y by template x, e.g. '{0}+{1}*{-1}+_'$.1 2 3 4 is 1+2*4+1" "\n"\
  2339. "$: monadic eye identity matrix of size x" "\n"\
  2340. "$: dyadic implode join y inserting x between" "\n"\
  2341. "";
  2342. cS V2HELP =\
  2343. "p. monadic print print x" "\n"\
  2344. "P. monadic println print x and a \\n" "\n"\
  2345. "f. monadic selfref1 monadic reference to current function or rhs of bind" "\n"\
  2346. "f. dyadic selfref2 dyadic reference to current function or rhs of bind" "\n"\
  2347. "F. monadic read read file (x=0 to read stdin)" "\n"\
  2348. "F. dyadic write write file (y=0 to write to stderr)" "\n"\
  2349. "t. monadic type type of x, array=0, verb=1, symbol=2, number=3, char=4, nil=5, udf=6" "\n"\
  2350. "r. monadic deal yield random elt of x" "\n"\
  2351. "r. dyadic roll roll xdy (note: y is 0-based, so >xr.y for 1-based)" "\n"\
  2352. "e. monadic eval eval expression, yields udf on parse error" "\n"\
  2353. "i. monadic import load and eval source file" "\n"\
  2354. "y. monadic system exec system command (yields output)" "\n"\
  2355. "y. dyadic system2 exec system command with input" "\n"\
  2356. "E. monadic exit exit with exit code" "\n"\
  2357. "L. dyadic tackleft prepend x to y" "\n"\
  2358. "R. dyadic tackright append x to y" "\n"\
  2359. "";
  2360. cS AHELP =\
  2361. "f\" each >\"1 2 3 yields 2 3 4" "\n"\
  2362. "xf\" merge 1 2 3,\"a b c yields (1,.a),:(2,.b),:(3,.c)" "\n"\
  2363. "f\". eachprior -\".1 2 2 3 5 6 yields 1 0 1 2 1" "\n"\
  2364. "xf\". eachpriorwith 0-\".1 2 2 3 5 6 yields 1 1 0 1 2 1" "\n"\
  2365. "f/ fold +/1 2 3 yields 6" "\n"\
  2366. "xf/ foldwith 1+/1 2 3 yields 7" "\n"\
  2367. "f\\ scan +\\1 2 3 yields 1 3 6" "\n"\
  2368. "xf\\ scanwith 1+\\1 2 3 yields 1 2 4 7" "\n"\
  2369. "f/. converge 1;_/.1 2 3 yields ()" "\n"\
  2370. "f\\. converges 1;_\\.1 2 3 yields 1 2 3,:2 3,:(,3),:()" "\n"\
  2371. "xf/. eachright 1-/.1 2 3 yields 0 1 2" "\n"\
  2372. "xf\\. eachleft 1-\\.1 2 3 yields 0 -1 -2" "\n"\
  2373. "f\": rank #\":1 2 3$1 yields 3 3, #\":inf 2 3$1 yields 1 1 1,:1 1 1" "\n"\
  2374. "xf\": rank2 1 2 3 *:\":1 1 2 3 yields (,1),:2 2,:3 3 3" "\n"\
  2375. "n` amend 'gw'0 3`'cross' yields 'grows'" "\n"\
  2376. "f&. filter >;0&.-2!.2 yields 1 2, basically shortcut for ]#.f" "\n"\
  2377. "f/: span =;' '/:'x y z' yields (,'x'),:(,'y'),:(,'z')" "\n"\
  2378. "xf/: stencil 3+//:!10 yields 3 6 9 12 15 18 21 24, shortcut for f\"x|:" "\n"\
  2379. "f;. reflex *;.5 yields 25, 5%;.2 yields 0.4" "\n"\
  2380. "";
  2381. cS CHELP =\
  2382. "f;g bond */;!.5 yields 120, +;1 5 yields 6, 5;- 1 yields 4" "\n"\
  2383. "f?.x pick >;5?.((2*),:<)\"3 6 yields 6 5" "\n"\
  2384. "f?:F while <;5?:>0 yields 5" "\n"\
  2385. "n?:f repeat 5?:*;2 1 yields 32" "\n"\
  2386. "f&:F if 1+&:+2 yields 2" "\n"\
  2387. "f;:F monaddyad -;:+5 yields -5, 1-;:+5 yields 6" "\n"\
  2388. "";
  2389. cS IHELP =\
  2390. "inverse of a function f is a function ~f that undoes the effect of f" "\n"\
  2391. "\n"\
  2392. "f::~f obverse define inverse ~f for f" "\n"\
  2393. "\n"\
  2394. "f-:x inverse ~fx" "\n"\
  2395. "xf-:y inverse2 (~fx)~f~fx" "\n"\
  2396. "f^:Fx under ~FfFx" "\n"\
  2397. "xf^:Fx under2 ~F(Fx)f(Fx)" "\n"\
  2398. "";
  2399. cS SHELP =\
  2400. "/ comment" "\n"\
  2401. "5+5 / also comment" "\n"\
  2402. "5+5/not comment (no whitespace before /)" "\n"\
  2403. "nil udf / special, nil and undefined" "\n"\
  2404. "'a'%2 / = nan, nan used to denote illegal numeric operation" "\n"\
  2405. "+1 2 3 / = udf, attempt to transpose flat vector, udf/undefined used to denote illegal operation" "\n"\
  2406. "5 5.5 -5 42 / number (double-precision floats)" "\n"\
  2407. "nan inf /" "\n"\
  2408. "'a' 'b' 'g' / chars (bytes)" "\n"\
  2409. "4t.0 / 0 NUL byte" "\n"\
  2410. "(4t.0),:(4t.16),:(4t.22) /" "\n"\
  2411. "1 2 3 / numbers array" "\n"\
  2412. "'hello world!' 'bla''bla' / quote, array of chars" "\n"\
  2413. ",'a' / 1-char string" "\n"\
  2414. ",1 / 1-elt array" "\n"\
  2415. "() / unit, empty array" "\n"\
  2416. "1,:(5+5),:1 2 3 / strand, mixed array literal" "\n"\
  2417. "-1 / negative num literal" "\n"\
  2418. "- 1 / application of - negate to 1" "\n"\
  2419. "-1 -2 -3 / array of negative nums" "\n"\
  2420. "- 1 2 3 / application of - negate to an array of nums" "\n"\
  2421. "5-5 / array of numbers 5 and -5" "\n"\
  2422. "5- 5 / 5 minus 5" "\n"\
  2423. "+ / verb" "\n"\
  2424. "5+5 / dyadic expr" "\n"\
  2425. "#1 2 3 / monadic expr (no left side)" "\n"\
  2426. "+/ *;. / adverb" "\n"\
  2427. "+;1 -;* +^:^. / conjunction" "\n"\
  2428. ":x+y / function literal" "\n"\
  2429. ":1 / function that always yields 1" "\n"\
  2430. "x:123 / bind name" "\n"\
  2431. "sq:*;. /" "\n"\
  2432. "fac:*/1+! / bind function" "\n"\
  2433. "f:x+y /" "\n"\
  2434. "f:-x / overload function by arity" "\n"\
  2435. "f 5 / = -5" "\n"\
  2436. "5 f 5 / = 10" "\n"\
  2437. "*/!. / hook, fgx -> f(g(x)), xfgy -> f(g(x, y))" "\n"\
  2438. "+/%# / fork, fghx -> g(f(x), h(x)), xfghy -> g(f(x), h(y))" "\n"\
  2439. "1+! / over, nfgx -> f(n, g(x)), xnfgy -> f(n, g(x, y))" "\n"\
  2440. "1+ / bond, nfx -> f(n, x), xnfy -> f(n, f(x, y))" "\n";
  2441. cS HELP = "\\0\thelp on syntax\n"\
  2442. "\\+\thelp on verbs\n"\
  2443. "\\a\thelp on additional verbs\n"\
  2444. "\\\"\thelp on adverbs\n"\
  2445. "\\;\thelp on conjunctions\n"\
  2446. "\\-:\thelp on inverses\n";
  2447. cS VSTR=VER " " __DATE__;
  2448. I main(I argc,S*argv){GC_INIT();
  2449. GC_enable_incremental();
  2450. guards=An();
  2451. Iin=isatty(0);
  2452. HASH_SEED=time(N);
  2453. srand(HASH_SEED);
  2454. VCACHE=Tnew();
  2455. SCACHE=Tnew();
  2456. for(Z i=0;i<AE(VERBS);i++){Vt*v=VnC(VERB);
  2457. v->val.verb=&VERBS[i];
  2458. Tset(VCACHE,VERBS[i].name,v);}
  2459. _UNIT=Vnew(ARRAY);
  2460. _UNIT->val.array=An();
  2461. St*st=Sn();
  2462. for(I i=1;i<=8;i++){NNUMS[i-1]=VnC(NUM);
  2463. NNUMS[i-1]->val.number=-i;}
  2464. for(I i=0;i<256;i++){NUMS[i]=VnC(NUM);
  2465. NUMS[i]->val.number=i;}
  2466. for(I i=0;i<256;i++){CHARS[i]=VnC(CHAR);
  2467. CHARS[i]->val._char=i;}
  2468. _NAN=VnC(NUM);
  2469. _NAN->val.number=NAN;
  2470. INF=VnC(NUM);
  2471. INF->val.number=INFINITY;
  2472. NINF=VnC(NUM);
  2473. NINF->val.number=-INFINITY;
  2474. Ar*vs=An();
  2475. for(Z i=0;i<strlen(VSTR);i++)Ap(vs,CHARS[VSTR[i]]);
  2476. Tset(st->env,"JKV",Vna(vs));
  2477. Tset(st->env,"E",Vnn(exp(1)));
  2478. Tset(st->env,"pi",Vnn(M_PI));
  2479. Tset(st->env,"tau",Vnn(M_PI*2));
  2480. Tset(st->env,"nan",_NAN);
  2481. Tset(st->env,"inf",INF);
  2482. Tset(st->env,"nil",st->nil);
  2483. Tset(st->env,"udf",st->udf);
  2484. Inverses=Tnew();
  2485. Tset(Inverses,"+",Gv("+"));
  2486. Tset(Inverses,"-",Gv("-"));
  2487. Tset(Inverses,"|",Gv("|"));
  2488. Tset(Inverses,"~",Gv("~"));
  2489. Tset(Inverses,"%",Gv("%"));
  2490. Tset(Inverses,"]",Gv("]"));
  2491. Tset(Inverses,"*:",Gv("%:"));
  2492. Tset(Inverses,"%:",Gv("*:"));
  2493. Tset(Inverses,">",Gv("<"));
  2494. Tset(Inverses,"<",Gv(">"));
  2495. Tset(Inverses,"_.",Gv("_:"));
  2496. Tset(Inverses,"_:",Gv("_."));
  2497. Tset(Inverses,"^.",Gv("^"));
  2498. Tset(Inverses,"^",Gv("^."));
  2499. Tset(Inverses,"+;.",Gv("%:"));
  2500. Tset(Inverses,"*/",Gv("["));
  2501. Tset(Inverses,"[",CV("*/"));
  2502. Tset(Inverses,"!",CV(">|/"));
  2503. Tset(Inverses,"!.",CV("|/"));
  2504. Tset(Inverses,"]@>:",CV("]@<:"));
  2505. Tset(Inverses,"]@<:",CV("]@>:"));
  2506. Ar*args=An();
  2507. for(I i=1;i<argc;i++){Ar*arg=An();
  2508. S s=argv[i];
  2509. WH(*s)Ap(arg,CHARS[*s++]);
  2510. Ap(args,Vna(arg));}
  2511. Tset(st->env,"args",Vna(args));
  2512. if(Iin)printf("jk\t\\\\ to exit \\ for help\n");
  2513. S s=N;
  2514. if(Iin)setjmp(Icp);
  2515. if(s){FR(s);s=N;}
  2516. LOOP{Bt*buffer;
  2517. C line[256];
  2518. buffer=Bnew();
  2519. if(Iin)putc('\t',stdout);
  2520. if(!fgets(line,SO(line),stdin))BR;
  2521. if(Iin){if(strcmp(line,"\\\\\n")==0)BR;
  2522. elif(strcmp(line,"\\\n")==0){printf("%s",HELP);CN;}
  2523. elif(strcmp(line,"\\0\n")==0){printf("%s",SHELP);CN;}
  2524. elif(strcmp(line,"\\+\n")==0){printf("%s",VHELP);CN;}
  2525. elif(strcmp(line,"\\a\n")==0){printf("%s",V2HELP);CN;}
  2526. elif(strcmp(line,"\\\"\n")==0){printf("%s",AHELP);CN;}
  2527. elif(strcmp(line,"\\;\n")==0){printf("%s",CHELP);CN;}
  2528. elif(strcmp(line,"\\-:\n")==0){printf("%s",IHELP);CN;}}
  2529. WH(strlen(line)>2&&strcmp(line+strlen(line)-3,"..\n")==0){line[strlen(line)-3]=0;
  2530. BappendS(buffer,line);
  2531. if(Iin)putc('\t',stdout);
  2532. if(!fgets(line,SO(line),stdin))R 0;}
  2533. BappendS(buffer,line);
  2534. s=Bread(buffer);
  2535. Vt*v=Srun(st,s);
  2536. FR(s);s=N;
  2537. if(v->tag!=NIL){Tset(st->env,"it",v);
  2538. S s=Vshow(v);
  2539. fputs(s,stdout);
  2540. if(Iin)putc('\n',stdout);}}}