jk.c 104 KB

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