jk.c 89 KB

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