jk.c 82 KB

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