jk.c 141 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630
  1. #include <ctype.h>
  2. #include <limits.h>
  3. #include <math.h>
  4. #include <setjmp.h>
  5. #include <stdbool.h>
  6. #include <stdint.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <time.h>
  11. #include <unistd.h>
  12. #include <sys/wait.h>
  13. #include <errno.h>
  14. #include <gc.h>
  15. #include "version.h"
  16. jmp_buf interactive_checkpoint;
  17. bool is_interactive;
  18. void *malloc_checked(size_t size) {
  19. void *p;
  20. if (!(p = GC_MALLOC(size)))
  21. abort();
  22. return p;
  23. }
  24. void *malloc_checked_atomic(size_t size) {
  25. void *p;
  26. if (!(p = GC_malloc_atomic(size)))
  27. abort();
  28. memset(p, 0, size);
  29. return p;
  30. }
  31. void *malloc_checked_uncollectable(size_t size) {
  32. void *p;
  33. if (!(p = GC_malloc_uncollectable(size)))
  34. abort();
  35. memset(p, 0, size);
  36. return p;
  37. }
  38. void *realloc_checked(void *p, size_t size) {
  39. if (!(p = GC_REALLOC(p, size)))
  40. abort();
  41. return p;
  42. }
  43. char *strdup_checked(char *s) {
  44. char *p = GC_strdup(s);
  45. if (!p)
  46. abort();
  47. return p;
  48. }
  49. typedef struct _list_t list_t;
  50. struct _list_t {
  51. void *value;
  52. list_t *next;
  53. };
  54. list_t *list_new(void) {
  55. list_t *list = malloc_checked(sizeof(list_t));
  56. list->value = NULL;
  57. list->next = NULL;
  58. return list;
  59. }
  60. bool list_empty(list_t *list) {
  61. return (!(list)->value);
  62. }
  63. size_t list_length(list_t *list) {
  64. size_t length = 0;
  65. if (list_empty(list))
  66. return length;
  67. do {
  68. list = list->next, length++;
  69. } while (list);
  70. return length;
  71. }
  72. void *list_index(list_t *list, ssize_t index) {
  73. size_t length;
  74. if (list_empty(list))
  75. return NULL;
  76. if (index == 0)
  77. return list->value;
  78. length = list_length(list);
  79. if (index < 0)
  80. index += ((ssize_t)length);
  81. if (index < 0 || index >= length)
  82. return NULL;
  83. for (size_t i = 0; i < ((size_t)index); i++)
  84. list = list->next;
  85. return list->value;
  86. }
  87. list_t *list_push(list_t *list, void *value) {
  88. list_t *head = list;
  89. if (list_empty(list)) {
  90. list->value = value;
  91. return head;
  92. }
  93. while (list->next)
  94. list = list->next;
  95. list = list->next = list_new();
  96. list->value = value;
  97. return head;
  98. }
  99. list_t *list_copy(list_t *l) {
  100. list_t *r = list_new();
  101. if (!list_empty(l))
  102. while (l) {
  103. list_push(r, l->value);
  104. l = l->next;
  105. }
  106. return r;
  107. }
  108. void *list_pop(list_t *list) {
  109. if (list_empty(list))
  110. return NULL;
  111. if (!list->next) {
  112. void *value = list->value;
  113. list->value = NULL;
  114. return value;
  115. }
  116. list_t *head = list;
  117. while (list) {
  118. if (!list->next) {
  119. void *value = list->value;
  120. list->value = NULL;
  121. head->next = NULL;
  122. return value;
  123. }
  124. head = list;
  125. list = list->next;
  126. }
  127. return NULL;
  128. }
  129. void *list_set(list_t *list, ssize_t index, void *value) {
  130. size_t length = list_length(list);
  131. if (index < 0)
  132. index += ((ssize_t)length);
  133. if (index == ((ssize_t)length)) {
  134. list_push(list, value);
  135. return value;
  136. }
  137. if (index < 0 || index >= length)
  138. return NULL;
  139. for (size_t i = 0; i < ((size_t)index); i++)
  140. list = list->next;
  141. list->value = value;
  142. return value;
  143. }
  144. list_t *list_insert(list_t **list, ssize_t index, void *value) {
  145. list_t *head = *list;
  146. if (index == -1)
  147. return list_push(head, value);
  148. size_t length = list_length(head);
  149. if (index < 0)
  150. index += (ssize_t)length;
  151. if (index < 0 || index > length)
  152. return NULL;
  153. if (index == -1)
  154. return list_push(head, value);
  155. if (index == 0) {
  156. if (list_empty(head))
  157. return list_push(head, value);
  158. list_t *temp = list_new();
  159. temp->value = value;
  160. temp->next = head;
  161. *list = temp;
  162. return temp;
  163. }
  164. list_t *temp0 = *list;
  165. for (size_t i = 0; i < ((size_t)index) - 1; i++)
  166. temp0 = temp0->next;
  167. list_t *temp = temp0->next;
  168. temp0->next = list_new();
  169. temp0->next->value = value;
  170. temp0->next->next = temp;
  171. return head;
  172. }
  173. list_t *list_delete(list_t **list, ssize_t index) {
  174. list_t *head = *list;
  175. if (list_empty(head))
  176. return NULL;
  177. size_t length = list_length(head);
  178. if (index < 0)
  179. index += (ssize_t)length;
  180. if (index < 0 || index >= length)
  181. return NULL;
  182. if (index == 0) {
  183. head->value = NULL;
  184. if (!head->next)
  185. return head;
  186. *list = head->next;
  187. return *list;
  188. }
  189. list_t *temp0 = *list;
  190. for (size_t i = 0; i < ((size_t)index) - 1; i++)
  191. temp0 = temp0->next;
  192. list_t *temp = temp0->next;
  193. temp->value = NULL;
  194. temp0->next = temp->next;
  195. return head;
  196. }
  197. list_t *list_sort(list_t *list, bool (*cmp)(void *, void *)) {
  198. size_t l = list_length(list);
  199. bool s;
  200. for (size_t i = 0; i < l; i++) {
  201. list_t *t = list;
  202. list_t *p = list;
  203. s = false;
  204. while (t->next) {
  205. list_t *n = t->next;
  206. if (cmp(t->value, n->value)) {
  207. s = true;
  208. if (t == list) {
  209. t->next = n->next;
  210. n->next = t;
  211. p = n;
  212. list = p;
  213. } else {
  214. t->next = n->next;
  215. n->next = t;
  216. p->next = n;
  217. p = n;
  218. }
  219. continue;
  220. }
  221. p = t;
  222. t = t->next;
  223. }
  224. if (!s)
  225. break;
  226. }
  227. return list;
  228. }
  229. typedef struct {
  230. char *str;
  231. size_t used;
  232. size_t allocated;
  233. } buffer_t;
  234. buffer_t *buffer_new(void) {
  235. buffer_t *buf = malloc_checked(sizeof(buffer_t));
  236. buf->str = NULL;
  237. buf->used = buf->allocated = 0;
  238. return buf;
  239. }
  240. void buffer_append(buffer_t *buf, char c) {
  241. buf->used++;
  242. if (buf->used > buf->allocated) {
  243. buf->allocated++;
  244. buf->str = realloc_checked(buf->str, sizeof(char) * buf->allocated);
  245. }
  246. buf->str[buf->used - 1] = c;
  247. }
  248. char *buffer_read(buffer_t *buf) {
  249. if (buf->used == 0 || buf->str[buf->used - 1])
  250. buffer_append(buf, 0);
  251. char *str = buf->str;
  252. GC_FREE(buf);
  253. return str;
  254. }
  255. void buffer_append_str(buffer_t *buf, char *s) {
  256. while (*s)
  257. buffer_append(buf, *s++);
  258. }
  259. typedef struct {
  260. enum token_tag_t { T_PUNCT, T_LPAR, T_RPAR, T_NAME, T_NUMBER, T_QUOTE } tag;
  261. char *text;
  262. } token_t;
  263. typedef struct {
  264. char *source;
  265. size_t len;
  266. size_t pos;
  267. list_t *tokens;
  268. } lexer_t;
  269. lexer_t *lexer_new(void) {
  270. lexer_t *lexer = malloc_checked(sizeof(lexer_t));
  271. return lexer;
  272. }
  273. char lexer_lookahead(lexer_t *lexer, size_t offset) {
  274. size_t pos = lexer->pos + offset;
  275. if (pos >= lexer->len)
  276. return 0;
  277. return lexer->source[pos];
  278. }
  279. char lexer_eat(lexer_t *lexer) {
  280. if (lexer->pos >= lexer->len)
  281. return 0;
  282. return lexer->source[lexer->pos++];
  283. }
  284. void lexer_push_token(lexer_t *lexer, enum token_tag_t tag, char *text) {
  285. token_t *token = malloc_checked(sizeof(token_t));
  286. token->tag = tag;
  287. token->text = text;
  288. list_push(lexer->tokens, token);
  289. }
  290. list_t *guards;
  291. jmp_buf *guard() {
  292. jmp_buf *lb = malloc_checked_atomic(sizeof(jmp_buf));
  293. list_push(guards, lb);
  294. return lb;
  295. }
  296. jmp_buf *guarding() {
  297. return list_index(guards, -1);
  298. }
  299. void unguard() {
  300. jmp_buf *lb = list_pop(guards);
  301. GC_FREE(lb);
  302. }
  303. void fatal(char *s) {
  304. jmp_buf *lb;
  305. if ((lb = guarding()))
  306. longjmp(*lb, 1);
  307. fprintf(stderr, "|%s error\n", s);
  308. if (is_interactive)
  309. longjmp(interactive_checkpoint, 1);
  310. exit(1);
  311. }
  312. void lexer_error(lexer_t *lexer, char *s) { fatal(s); }
  313. void lexer_lex_number(lexer_t *lexer, bool is_negative) {
  314. buffer_t *buf = buffer_new();
  315. if (is_negative)
  316. buffer_append(buf, '-');
  317. if (lexer_lookahead(lexer, 0) == '.') {
  318. buffer_append(buf, lexer_eat(lexer));
  319. if (!(isdigit(lexer_lookahead(lexer, 0))))
  320. lexer_error(lexer, "trailing-dot");
  321. }
  322. do {
  323. buffer_append(buf, lexer_eat(lexer));
  324. } while (isdigit(lexer_lookahead(lexer, 0)));
  325. if (lexer_lookahead(lexer, 0) == '.') {
  326. buffer_append(buf, lexer_eat(lexer));
  327. if (!(isdigit(lexer_lookahead(lexer, 0))))
  328. lexer_error(lexer, "trailing-dot");
  329. do {
  330. buffer_append(buf, lexer_eat(lexer));
  331. } while (isdigit(lexer_lookahead(lexer, 0)));
  332. }
  333. lexer_push_token(lexer, T_NUMBER, buffer_read(buf));
  334. }
  335. void lexer_lex(lexer_t *lexer, char *s) {
  336. lexer->source = s;
  337. lexer->len = strlen(s);
  338. lexer->pos = 0;
  339. lexer->tokens = list_new();
  340. while (lexer->pos < lexer->len) {
  341. char c = lexer_lookahead(lexer, 0);
  342. if (c == '/' && list_empty(lexer->tokens))
  343. break;
  344. if (isspace(c)) {
  345. lexer_eat(lexer);
  346. if (lexer_lookahead(lexer, 0) == '/')
  347. break;
  348. } else if (isdigit(c) || c == '.') {
  349. lexer_lex_number(lexer, false);
  350. } else if (isalpha(c)) {
  351. buffer_t *buf = buffer_new();
  352. do {
  353. buffer_append(buf, lexer_eat(lexer));
  354. } while (isalpha(lexer_lookahead(lexer, 0)));
  355. if (buf->used == 1 && lexer_lookahead(lexer, 0) == '.') {
  356. buffer_append(buf, lexer_eat(lexer));
  357. lexer_push_token(lexer, T_PUNCT, buffer_read(buf));
  358. } else
  359. lexer_push_token(lexer, T_NAME, buffer_read(buf));
  360. } else if (c == '(' || c == ')') {
  361. lexer_eat(lexer);
  362. lexer_push_token(lexer, c == '(' ? T_LPAR : T_RPAR, NULL);
  363. } else if (c == '\'') {
  364. buffer_t *buf = buffer_new();
  365. lexer_eat(lexer);
  366. for (;;) {
  367. if (lexer->pos >= lexer->len)
  368. lexer_error(lexer, "unmatched-quote");
  369. if (lexer_lookahead(lexer, 0) == '\'') {
  370. if (lexer_lookahead(lexer, 1) == '\'') {
  371. buffer_append(buf, lexer_eat(lexer));
  372. lexer_eat(lexer);
  373. continue;
  374. }
  375. lexer_eat(lexer);
  376. break;
  377. }
  378. buffer_append(buf, lexer_eat(lexer));
  379. }
  380. lexer_push_token(lexer, T_QUOTE, buffer_read(buf));
  381. } else if (ispunct(c)) {
  382. char buf[3];
  383. buf[0] = lexer_eat(lexer);
  384. buf[1] = 0;
  385. if (lexer_lookahead(lexer, 0) == '.' ||
  386. lexer_lookahead(lexer, 0) == ':') {
  387. buf[1] = lexer_eat(lexer);
  388. buf[2] = 0;
  389. }
  390. if (strcmp(buf, "-") == 0 && isdigit(lexer_lookahead(lexer, 0))) {
  391. lexer_lex_number(lexer, true);
  392. continue;
  393. }
  394. lexer_push_token(lexer, T_PUNCT, strdup_checked(buf));
  395. } else
  396. lexer_error(lexer, "lex");
  397. }
  398. }
  399. typedef struct _table_t table_t;
  400. typedef struct _table_entry_t table_entry_t;
  401. struct _table_entry_t {
  402. char *key;
  403. void *value;
  404. bool is_deleted;
  405. };
  406. struct _table_t {
  407. table_entry_t *entries;
  408. size_t used;
  409. size_t capacity;
  410. };
  411. #define TABLE_MIN_SIZE 32
  412. table_t *table_new(void) {
  413. table_t *table = malloc_checked(sizeof(table_t));
  414. table->used = 0;
  415. table->capacity = TABLE_MIN_SIZE;
  416. table->entries = malloc_checked(table->capacity * sizeof(table_entry_t));
  417. return table;
  418. }
  419. size_t table_length(table_t *table) {
  420. return table->used;
  421. }
  422. bool table_empty(table_t *table) {
  423. return table->used == 0;
  424. }
  425. static uint64_t MM86128(void *key, const int len, uint32_t seed) {
  426. #define ROTL32(x, r) ((x << r) | (x >> (32 - r)))
  427. #define FMIX32(h) \
  428. h ^= h >> 16; \
  429. h *= 0x85ebca6b; \
  430. h ^= h >> 13; \
  431. h *= 0xc2b2ae35; \
  432. h ^= h >> 16;
  433. const uint8_t *data = (const uint8_t *)key;
  434. const int nblocks = len / 16;
  435. uint32_t h1 = seed;
  436. uint32_t h2 = seed;
  437. uint32_t h3 = seed;
  438. uint32_t h4 = seed;
  439. uint32_t c1 = 0x239b961b;
  440. uint32_t c2 = 0xab0e9789;
  441. uint32_t c3 = 0x38b34ae5;
  442. uint32_t c4 = 0xa1e38b93;
  443. const uint32_t *blocks = (const uint32_t *)(data + nblocks * 16);
  444. for (int i = -nblocks; i; i++) {
  445. uint32_t k1 = blocks[i * 4 + 0];
  446. uint32_t k2 = blocks[i * 4 + 1];
  447. uint32_t k3 = blocks[i * 4 + 2];
  448. uint32_t k4 = blocks[i * 4 + 3];
  449. k1 *= c1;
  450. k1 = ROTL32(k1, 15);
  451. k1 *= c2;
  452. h1 ^= k1;
  453. h1 = ROTL32(h1, 19);
  454. h1 += h2;
  455. h1 = h1 * 5 + 0x561ccd1b;
  456. k2 *= c2;
  457. k2 = ROTL32(k2, 16);
  458. k2 *= c3;
  459. h2 ^= k2;
  460. h2 = ROTL32(h2, 17);
  461. h2 += h3;
  462. h2 = h2 * 5 + 0x0bcaa747;
  463. k3 *= c3;
  464. k3 = ROTL32(k3, 17);
  465. k3 *= c4;
  466. h3 ^= k3;
  467. h3 = ROTL32(h3, 15);
  468. h3 += h4;
  469. h3 = h3 * 5 + 0x96cd1c35;
  470. k4 *= c4;
  471. k4 = ROTL32(k4, 18);
  472. k4 *= c1;
  473. h4 ^= k4;
  474. h4 = ROTL32(h4, 13);
  475. h4 += h1;
  476. h4 = h4 * 5 + 0x32ac3b17;
  477. }
  478. const uint8_t *tail = (const uint8_t *)(data + nblocks * 16);
  479. uint32_t k1 = 0;
  480. uint32_t k2 = 0;
  481. uint32_t k3 = 0;
  482. uint32_t k4 = 0;
  483. switch (len & 15) {
  484. case 15:
  485. k4 ^= tail[14] << 16;
  486. case 14:
  487. k4 ^= tail[13] << 8;
  488. case 13:
  489. k4 ^= tail[12] << 0;
  490. k4 *= c4;
  491. k4 = ROTL32(k4, 18);
  492. k4 *= c1;
  493. h4 ^= k4;
  494. case 12:
  495. k3 ^= tail[11] << 24;
  496. case 11:
  497. k3 ^= tail[10] << 16;
  498. case 10:
  499. k3 ^= tail[9] << 8;
  500. case 9:
  501. k3 ^= tail[8] << 0;
  502. k3 *= c3;
  503. k3 = ROTL32(k3, 17);
  504. k3 *= c4;
  505. h3 ^= k3;
  506. case 8:
  507. k2 ^= tail[7] << 24;
  508. case 7:
  509. k2 ^= tail[6] << 16;
  510. case 6:
  511. k2 ^= tail[5] << 8;
  512. case 5:
  513. k2 ^= tail[4] << 0;
  514. k2 *= c2;
  515. k2 = ROTL32(k2, 16);
  516. k2 *= c3;
  517. h2 ^= k2;
  518. case 4:
  519. k1 ^= tail[3] << 24;
  520. case 3:
  521. k1 ^= tail[2] << 16;
  522. case 2:
  523. k1 ^= tail[1] << 8;
  524. case 1:
  525. k1 ^= tail[0] << 0;
  526. k1 *= c1;
  527. k1 = ROTL32(k1, 15);
  528. k1 *= c2;
  529. h1 ^= k1;
  530. }
  531. h1 ^= len;
  532. h2 ^= len;
  533. h3 ^= len;
  534. h4 ^= len;
  535. h1 += h2;
  536. h1 += h3;
  537. h1 += h4;
  538. h2 += h1;
  539. h3 += h1;
  540. h4 += h1;
  541. FMIX32(h1);
  542. FMIX32(h2);
  543. FMIX32(h3);
  544. FMIX32(h4);
  545. h1 += h2;
  546. h1 += h3;
  547. h1 += h4;
  548. h2 += h1;
  549. h3 += h1;
  550. h4 += h1;
  551. return (((uint64_t)h2) << 32) | h1;
  552. }
  553. static uint32_t HASH_SEED = 0;
  554. void *table_get(table_t *table, char *key) {
  555. if (table_empty(table))
  556. return NULL;
  557. uint64_t hash = MM86128(key, strlen(key), HASH_SEED);
  558. size_t index = hash % table->capacity;
  559. size_t i = index;
  560. while (table->entries[i].key) {
  561. if (!table->entries[i].is_deleted &&
  562. strcmp(table->entries[i].key, key) == 0)
  563. return table->entries[i].value;
  564. i++;
  565. if (i >= table->capacity)
  566. i = 0;
  567. if (i == index)
  568. break;
  569. }
  570. return NULL;
  571. }
  572. bool table_has(table_t *table, char *key) {
  573. if (table_empty(table))
  574. return false;
  575. uint64_t hash = MM86128(key, strlen(key), HASH_SEED);
  576. size_t index = hash % table->capacity;
  577. size_t i = index;
  578. while (table->entries[i].key) {
  579. if (!table->entries[i].is_deleted &&
  580. strcmp(table->entries[i].key, key) == 0)
  581. return true;
  582. i++;
  583. if (i >= table->capacity)
  584. i = 0;
  585. if (i == index)
  586. break;
  587. }
  588. return false;
  589. }
  590. static void table_entry_set(table_entry_t *entries, char *key, void *value,
  591. size_t capacity, size_t *used) {
  592. uint64_t hash = MM86128(key, strlen(key), HASH_SEED);
  593. size_t index = hash % capacity;
  594. size_t i = index;
  595. while (entries[i].key) {
  596. if (strcmp(entries[i].key, key) == 0) {
  597. entries[i].value = value;
  598. if (entries[i].is_deleted) {
  599. if (used)
  600. (*used)++;
  601. entries[i].is_deleted = false;
  602. }
  603. return;
  604. } else if (entries[i].is_deleted)
  605. break;
  606. i++;
  607. if (i >= capacity)
  608. i = 0;
  609. if (i == index)
  610. break;
  611. }
  612. if (used)
  613. (*used)++;
  614. entries[i].key = key;
  615. entries[i].value = value;
  616. entries[i].is_deleted = false;
  617. }
  618. table_t *table_set(table_t *table, char *key, void *value) {
  619. if (table->used >= table->capacity) {
  620. size_t capacity = table->capacity + TABLE_MIN_SIZE;
  621. table_entry_t *entries = malloc_checked(capacity * sizeof(table_entry_t));
  622. for (size_t i = 0; i < table->capacity; i++) {
  623. table_entry_t entry = table->entries[i];
  624. if (entry.key && !entry.is_deleted)
  625. table_entry_set(entries, entry.key, entry.value, capacity, NULL);
  626. }
  627. GC_FREE(table->entries);
  628. table->entries = entries;
  629. table->capacity = capacity;
  630. }
  631. table_entry_set(table->entries, key, value, table->capacity, &table->used);
  632. return table;
  633. }
  634. typedef struct _value_t value_t;
  635. typedef struct _interpreter_t interpreter_t;
  636. typedef struct _verb_t verb_t;
  637. struct _interpreter_t {
  638. table_t *env;
  639. list_t *args;
  640. list_t *selfrefs;
  641. value_t *nil;
  642. value_t *udf;
  643. value_t *unit;
  644. verb_t *at;
  645. };
  646. struct _verb_t {
  647. char *name;
  648. unsigned int rank[3];
  649. list_t *bonds;
  650. bool mark;
  651. bool is_fun;
  652. value_t *(*monad)(interpreter_t *, verb_t *, value_t *);
  653. value_t *(*dyad)(interpreter_t *, verb_t *, value_t *, value_t *);
  654. };
  655. typedef struct {
  656. char *name;
  657. verb_t *(*adverb)(interpreter_t *, value_t *);
  658. verb_t *(*conjunction)(interpreter_t *, value_t *, value_t *);
  659. } adverb_t;
  660. struct _value_t {
  661. enum value_tag_t { ARRAY, VERB, SYMBOL, NUMBER, CHAR, NIL, UDF } tag;
  662. union {
  663. list_t *array;
  664. verb_t *verb;
  665. char *symbol;
  666. double number;
  667. unsigned char _char;
  668. } val;
  669. };
  670. verb_t *verb_new() {
  671. verb_t *verb = malloc_checked(sizeof(verb_t));
  672. return verb;
  673. }
  674. value_t *value_new(enum value_tag_t tag) {
  675. value_t *val;
  676. if (tag > SYMBOL)
  677. val = malloc_checked_atomic(sizeof(value_t));
  678. else
  679. val = malloc_checked(sizeof(value_t));
  680. val->tag = tag;
  681. return val;
  682. }
  683. value_t *value_new_const(enum value_tag_t tag) {
  684. value_t *val = malloc_checked_uncollectable(sizeof(value_t));
  685. val->tag = tag;
  686. return val;
  687. }
  688. value_t *_UNIT;
  689. value_t *value_new_array(list_t *array) {
  690. if (list_empty(array)) {
  691. GC_FREE(array);
  692. return _UNIT;
  693. }
  694. value_t *val = value_new(ARRAY);
  695. val->val.array = array;
  696. return val;
  697. }
  698. table_t *VCACHE;
  699. value_t *value_new_verb(verb_t *verb) {
  700. value_t *val;
  701. if ((val = table_get(VCACHE, verb->name)))
  702. return val;
  703. val = value_new(VERB);
  704. val->val.verb = verb;
  705. return val;
  706. }
  707. table_t *SCACHE;
  708. value_t *value_new_symbol(char *symbol) {
  709. value_t *val;
  710. if ((val = table_get(SCACHE, symbol)))
  711. return val;
  712. val = value_new_const(SYMBOL);
  713. val->val.symbol = symbol;
  714. table_set(SCACHE, symbol, val);
  715. return val;
  716. }
  717. value_t *_NAN, *INF, *NINF;
  718. value_t *NNUMS[8];
  719. value_t *NUMS[256];
  720. value_t *CHARS[256];
  721. value_t *value_new_number(double number) {
  722. if (isnan(number))
  723. return _NAN;
  724. else if (number == INFINITY)
  725. return INF;
  726. else if (number == -INFINITY)
  727. return NINF;
  728. else if (number >= 0 && number < 256 && number == (double)((size_t)number))
  729. return NUMS[(size_t)number];
  730. else if (number < 0 && number >= -8 &&
  731. fabs(number) == (double)((size_t)fabs(number)))
  732. return NNUMS[((size_t)fabs(number)) - 1];
  733. value_t *val = value_new(NUMBER);
  734. val->val.number = number;
  735. return val;
  736. }
  737. value_t *value_new_char(unsigned char _char) { return CHARS[_char]; }
  738. bool value_equals(value_t *x, value_t *y) {
  739. if (x->tag != y->tag)
  740. return false;
  741. switch (x->tag) {
  742. case ARRAY: {
  743. list_t *tx = x->val.array;
  744. list_t *ty = y->val.array;
  745. if (list_empty(tx) && list_empty(ty))
  746. break;
  747. if (list_empty(tx) && !list_empty(ty))
  748. return false;
  749. if (!list_empty(tx) && list_empty(ty))
  750. return false;
  751. while (tx) {
  752. if (!ty)
  753. return false;
  754. if (!value_equals(tx->value, ty->value))
  755. return false;
  756. tx = tx->next;
  757. ty = ty->next;
  758. }
  759. if (ty)
  760. return false;
  761. }
  762. case VERB:
  763. return strcmp(x->val.verb->name, x->val.verb->name) == 0;
  764. case SYMBOL:
  765. return strcmp(x->val.symbol, y->val.symbol) == 0;
  766. case NUMBER:
  767. if (isnan(x->val.number) && isnan(y->val.number))
  768. break;
  769. return x->val.number == y->val.number;
  770. case CHAR:
  771. return x == y;
  772. case NIL:
  773. case UDF:
  774. break;
  775. }
  776. return true;
  777. }
  778. bool is_char_array(list_t *a) {
  779. if (list_empty(a))
  780. return false;
  781. while (a) {
  782. value_t *v = a->value;
  783. if (v->tag != CHAR || !isprint(v->val._char))
  784. return false;
  785. a = a->next;
  786. }
  787. return true;
  788. }
  789. bool is_arrays_array(list_t *a) {
  790. if (list_empty(a))
  791. return false;
  792. while (a) {
  793. value_t *v = a->value;
  794. if (v->tag != ARRAY)
  795. return false;
  796. a = a->next;
  797. }
  798. return true;
  799. }
  800. char *value_show(value_t *v);
  801. char *show_array(value_t *v) {
  802. if (v->tag != ARRAY)
  803. return value_show(v);
  804. list_t *t = v->val.array;
  805. if (list_empty(t))
  806. return strdup_checked("()");
  807. buffer_t *buf = buffer_new();
  808. if (!t->next) {
  809. buffer_append(buf, ',');
  810. char *ts = value_show(t->value);
  811. buffer_append_str(buf, ts);
  812. GC_FREE(ts);
  813. return buffer_read(buf);
  814. }
  815. if (is_char_array(t)) {
  816. while (t) {
  817. value_t *c = t->value;
  818. buffer_append(buf, c->val._char);
  819. t = t->next;
  820. }
  821. return buffer_read(buf);
  822. }
  823. if (!is_arrays_array(t)) {
  824. while (t) {
  825. char *ts = value_show(t->value);
  826. buffer_append_str(buf, ts);
  827. GC_FREE(ts);
  828. t = t->next;
  829. if (t)
  830. buffer_append(buf, ' ');
  831. }
  832. } else {
  833. unsigned int rwk = 0;
  834. unsigned int rwl = list_length(t->value);
  835. while (t) {
  836. char *ts = show_array(t->value);
  837. buffer_append_str(buf, ts);
  838. GC_FREE(ts);
  839. t = t->next;
  840. if (t)
  841. buffer_append(buf, ' ');
  842. rwk++;
  843. if (rwk >= rwl && t) {
  844. rwk = 0;
  845. buffer_append(buf, '\n');
  846. }
  847. }
  848. }
  849. return buffer_read(buf);
  850. }
  851. char *value_show(value_t *v) {
  852. switch (v->tag) {
  853. case ARRAY:
  854. return show_array(v);
  855. case VERB:
  856. return strdup_checked(v->val.verb->name);
  857. case SYMBOL:
  858. return strdup_checked(v->val.symbol);
  859. case NUMBER: {
  860. char buf[128];
  861. snprintf(buf, sizeof(buf), "%.15g", v->val.number);
  862. return strdup_checked(buf);
  863. }
  864. case CHAR: {
  865. if (!isprint(v->val._char)) {
  866. char buf[16];
  867. snprintf(buf, sizeof(buf), "4t.%d", v->val._char);
  868. return strdup_checked(buf);
  869. }
  870. char buf[2];
  871. buf[0] = v->val._char;
  872. buf[1] = 0;
  873. return strdup_checked(buf);
  874. }
  875. case NIL:
  876. return strdup_checked("nil");
  877. case UDF:
  878. return strdup_checked("udf");
  879. }
  880. return strdup_checked("<?>");
  881. }
  882. double get_numeric(value_t *v) {
  883. if (v->tag == CHAR)
  884. return v->val._char;
  885. return v->val.number;
  886. }
  887. bool value_is_truthy(value_t *x) {
  888. switch (x->tag) {
  889. case ARRAY:
  890. return !list_empty(x->val.array);
  891. case NUMBER:
  892. case CHAR:
  893. return get_numeric(x) != 0;
  894. case NIL:
  895. case UDF:
  896. return false;
  897. default:
  898. return true;
  899. }
  900. }
  901. verb_t *find_verb(char *s);
  902. interpreter_t *interpreter_new(void) {
  903. interpreter_t *state = malloc_checked(sizeof(interpreter_t));
  904. state->env = table_new();
  905. state->args = list_new();
  906. state->selfrefs = list_new();
  907. state->nil = value_new(NIL);
  908. state->udf = value_new(UDF);
  909. state->unit = _UNIT;
  910. state->at = find_verb("@");
  911. return state;
  912. }
  913. void interpreter_error(interpreter_t *state, char *e) {
  914. fprintf(stderr, "%s error\n", e);
  915. exit(1);
  916. }
  917. value_t *each_rank(interpreter_t *state, verb_t *f, value_t *x, unsigned int d,
  918. unsigned int rm) {
  919. if (!f->monad)
  920. return state->udf;
  921. if (d >= rm || x->tag != ARRAY) {
  922. if (f->mark)
  923. list_push(state->selfrefs, f);
  924. value_t *r = f->monad(state, f, x);
  925. if (f->mark)
  926. list_pop(state->selfrefs);
  927. return r;
  928. }
  929. list_t *t = x->val.array;
  930. if (list_empty(t))
  931. return x;
  932. list_t *l = list_new();
  933. while (t) {
  934. list_push(l, each_rank(state, f, t->value, d + 1, rm));
  935. t = t->next;
  936. }
  937. return value_new_array(l);
  938. }
  939. value_t *apply_monad(interpreter_t *state, value_t *f, value_t *x) {
  940. if (f->tag != VERB)
  941. return state->udf;
  942. if (!f->val.verb->monad)
  943. return state->udf;
  944. return each_rank(state, f->val.verb, x, 0, f->val.verb->rank[0]);
  945. }
  946. value_t *together(interpreter_t *state, verb_t *f, value_t *x, value_t *y,
  947. unsigned int dl, unsigned int dr, unsigned int rl,
  948. unsigned int rr) {
  949. if (!f->dyad)
  950. return state->udf;
  951. if (dl >= rl && dr >= rr) {
  952. if (f->mark)
  953. list_push(state->selfrefs, f);
  954. value_t *r = f->dyad(state, f, x, y);
  955. if (f->mark)
  956. list_pop(state->selfrefs);
  957. return r;
  958. }
  959. if (dl < rl && dr < rr && x->tag == ARRAY && y->tag == ARRAY) {
  960. list_t *tx = x->val.array;
  961. list_t *ty = y->val.array;
  962. if (!tx->value || !ty->value)
  963. return !tx->value ? x : y;
  964. list_t *t = list_new();
  965. while (tx) {
  966. if (!ty)
  967. break;
  968. list_push(
  969. t, together(state, f, tx->value, ty->value, dl + 1, dr + 1, rl, rr));
  970. tx = tx->next;
  971. ty = ty->next;
  972. }
  973. return value_new_array(t);
  974. } else if ((x->tag != ARRAY || dl >= rl) && y->tag == ARRAY && dr < rr) {
  975. list_t *ty = y->val.array;
  976. if (!ty->value)
  977. return y;
  978. list_t *t = list_new();
  979. while (ty) {
  980. list_push(t, together(state, f, x, ty->value, dl, dr + 1, rl, rr));
  981. ty = ty->next;
  982. }
  983. return value_new_array(t);
  984. } else if ((y->tag != ARRAY || dr >= rr) && x->tag == ARRAY && dl < rl) {
  985. list_t *tx = x->val.array;
  986. if (!tx->value)
  987. return x;
  988. list_t *t = list_new();
  989. while (tx) {
  990. list_push(t, together(state, f, tx->value, y, dl + 1, dr, rl, rr));
  991. tx = tx->next;
  992. }
  993. return value_new_array(t);
  994. }
  995. if (f->mark)
  996. list_push(state->selfrefs, f);
  997. value_t *r = f->dyad(state, f, x, y);
  998. if (f->mark)
  999. list_pop(state->selfrefs);
  1000. return r;
  1001. }
  1002. value_t *apply_dyad(interpreter_t *state, value_t *f, value_t *x, value_t *y) {
  1003. if (f->tag != VERB)
  1004. return state->nil;
  1005. return together(state, f->val.verb, x, y, 0, 0, f->val.verb->rank[1],
  1006. f->val.verb->rank[2]);
  1007. }
  1008. typedef struct _node_t node_t;
  1009. struct _node_t {
  1010. enum node_tag_t {
  1011. N_STRAND,
  1012. N_LITERAL,
  1013. N_INDEX1,
  1014. N_INDEX2,
  1015. N_FUN,
  1016. N_MONAD,
  1017. N_DYAD,
  1018. N_ADV,
  1019. N_CONJ,
  1020. N_PARTIAL_CONJ,
  1021. N_FORK,
  1022. N_HOOK,
  1023. N_BOND,
  1024. N_OVER,
  1025. N_BIND
  1026. } tag;
  1027. adverb_t *av;
  1028. value_t *v;
  1029. list_t *l;
  1030. node_t *a;
  1031. node_t *b;
  1032. node_t *c;
  1033. };
  1034. value_t *_fork_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1035. verb_t *f = list_index(self->bonds, 0);
  1036. verb_t *g = list_index(self->bonds, 1);
  1037. verb_t *h = list_index(self->bonds, 2);
  1038. value_t *l = each_rank(state, f, x, 0, f->rank[0]);
  1039. value_t *r = each_rank(state, h, x, 0, f->rank[0]);
  1040. return together(state, g, l, r, 0, 0, g->rank[1], g->rank[2]);
  1041. }
  1042. value_t *_fork_dyad(interpreter_t *state, verb_t *self, value_t *x,
  1043. value_t *y) {
  1044. verb_t *f = list_index(self->bonds, 0);
  1045. verb_t *g = list_index(self->bonds, 1);
  1046. verb_t *h = list_index(self->bonds, 2);
  1047. value_t *l = each_rank(state, f, x, 0, f->rank[0]);
  1048. value_t *r = each_rank(state, h, y, 0, f->rank[0]);
  1049. return together(state, g, l, r, 0, 0, g->rank[1], g->rank[2]);
  1050. }
  1051. value_t *_hook_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1052. verb_t *f = list_index(self->bonds, 0);
  1053. verb_t *g = list_index(self->bonds, 1);
  1054. value_t *r = each_rank(state, g, x, 0, g->rank[0]);
  1055. return each_rank(state, f, r, 0, f->rank[0]);
  1056. }
  1057. value_t *_hook_dyad(interpreter_t *state, verb_t *self, value_t *x,
  1058. value_t *y) {
  1059. verb_t *f = list_index(self->bonds, 0);
  1060. verb_t *g = list_index(self->bonds, 1);
  1061. value_t *r = together(state, g, x, y, 0, 0, g->rank[1], g->rank[2]);
  1062. return each_rank(state, f, r, 0, f->rank[0]);
  1063. }
  1064. value_t *_bond_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1065. verb_t *f = list_index(self->bonds, 0);
  1066. value_t *g = list_index(self->bonds, 1);
  1067. return together(state, f, g, x, 0, 0, f->rank[1], f->rank[2]);
  1068. }
  1069. value_t *_bond_dyad(interpreter_t *state, verb_t *self, value_t *x,
  1070. value_t *y) {
  1071. verb_t *f = list_index(self->bonds, 0);
  1072. value_t *g = list_index(self->bonds, 1);
  1073. value_t *r = together(state, f, x, y, 0, 0, f->rank[1], f->rank[2]);
  1074. return together(state, f, x, r, 0, 0, f->rank[1], f->rank[2]);
  1075. }
  1076. value_t *_over_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1077. value_t *f = list_index(self->bonds, 0);
  1078. verb_t *g = list_index(self->bonds, 1);
  1079. verb_t *h = list_index(self->bonds, 2);
  1080. value_t *l = each_rank(state, h, x, 0, h->rank[0]);
  1081. return together(state, g, f, l, 0, 0, g->rank[1], g->rank[2]);
  1082. }
  1083. value_t *_over_dyad(interpreter_t *state, verb_t *self, value_t *x,
  1084. value_t *y) {
  1085. value_t *f = list_index(self->bonds, 0);
  1086. verb_t *g = list_index(self->bonds, 1);
  1087. verb_t *h = list_index(self->bonds, 2);
  1088. value_t *l = together(state, h, x, y, 0, 0, h->rank[1], h->rank[2]);
  1089. return together(state, g, f, l, 0, 0, g->rank[1], g->rank[2]);
  1090. }
  1091. bool function_collect_args(node_t *node, unsigned int *argc) {
  1092. if (!node)
  1093. return false;
  1094. if (node->tag == N_LITERAL && node->v->tag == SYMBOL &&
  1095. strcmp(node->v->val.symbol, "y") == 0) {
  1096. *argc = 2;
  1097. return true;
  1098. } else if (node->tag == N_LITERAL && node->v->tag == SYMBOL &&
  1099. strcmp(node->v->val.symbol, "x") == 0) {
  1100. if (*argc < 2)
  1101. *argc = 1;
  1102. } else if (node->tag == N_MONAD || node->tag == N_CONJ ||
  1103. node->tag == N_HOOK || node->tag == N_BOND ||
  1104. node->tag == N_INDEX1) {
  1105. if (function_collect_args(node->a, argc))
  1106. return true;
  1107. if (function_collect_args(node->b, argc))
  1108. return true;
  1109. } else if (node->tag == N_DYAD || node->tag == N_FORK ||
  1110. node->tag == N_OVER || node->tag == N_INDEX2) {
  1111. if (function_collect_args(node->a, argc))
  1112. return true;
  1113. if (function_collect_args(node->b, argc))
  1114. return true;
  1115. if (function_collect_args(node->c, argc))
  1116. return true;
  1117. } else if (node->tag == N_ADV) {
  1118. if (function_collect_args(node->a, argc))
  1119. return true;
  1120. } else if (node->tag == N_STRAND) {
  1121. list_t *t = node->l;
  1122. while (t) {
  1123. if (function_collect_args(t->value, argc))
  1124. return true;
  1125. t = t->next;
  1126. }
  1127. }
  1128. return false;
  1129. }
  1130. value_t *interpreter_walk(interpreter_t *state, node_t *node);
  1131. value_t *_const_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1132. return self->bonds->value;
  1133. }
  1134. value_t *_const_dyad(interpreter_t *state, verb_t *self, value_t *x,
  1135. value_t *y) {
  1136. return self->bonds->value;
  1137. }
  1138. value_t *_fun_monad(interpreter_t *state, verb_t *self, value_t *x) {
  1139. list_t *args = list_new();
  1140. list_push(args, x);
  1141. list_push(args, self);
  1142. list_push(state->args, args);
  1143. value_t *r = interpreter_walk(state, self->bonds->value);
  1144. list_pop(state->args);
  1145. GC_FREE(args);
  1146. return r;
  1147. }
  1148. value_t *_fun_dyad(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1149. list_t *args = list_new();
  1150. list_push(args, x);
  1151. list_push(args, y);
  1152. list_push(args, self);
  1153. list_push(state->args, args);
  1154. value_t *r = interpreter_walk(state, self->bonds->next->value);
  1155. list_pop(state->args);
  1156. GC_FREE(args);
  1157. return r;
  1158. }
  1159. value_t *_partial_conjunction(interpreter_t *state, verb_t *self, value_t *x) {
  1160. adverb_t *av = self->bonds->value;
  1161. value_t *a = self->bonds->next->value;
  1162. return value_new_verb(av->conjunction(state, a, x));
  1163. }
  1164. node_t *node_new1(enum node_tag_t tag, node_t *a);
  1165. value_t *interpreter_walk(interpreter_t *state, node_t *node) {
  1166. if (!node)
  1167. return state->nil;
  1168. switch (node->tag) {
  1169. case N_STRAND: {
  1170. list_t *t = node->l;
  1171. while (t) {
  1172. t->value = interpreter_walk(state, t->value);
  1173. t = t->next;
  1174. }
  1175. return value_new_array(node->l);
  1176. }
  1177. case N_LITERAL: {
  1178. value_t *v = node->v;
  1179. value_t *t = NULL;
  1180. if (v->tag == SYMBOL) {
  1181. char *n = v->val.symbol;
  1182. if (!list_empty(state->args)) {
  1183. list_t *args = list_index(state->args, -1);
  1184. size_t argc = list_length(args) - 1;
  1185. if (argc == 2 && strcmp(n, "y") == 0)
  1186. return args->next->value;
  1187. else if (strcmp(n, "x") == 0)
  1188. return args->value;
  1189. }
  1190. if ((t = table_get(state->env, n)))
  1191. return t;
  1192. }
  1193. return v;
  1194. }
  1195. case N_INDEX1:
  1196. return together(state, state->at, interpreter_walk(state, node->a),
  1197. interpreter_walk(state, node->b), 0, 0, state->at->rank[1],
  1198. state->at->rank[2]);
  1199. case N_INDEX2:
  1200. return together(state, state->at,
  1201. together(state, state->at, interpreter_walk(state, node->a),
  1202. interpreter_walk(state, node->b), 0, 0,
  1203. state->at->rank[1], state->at->rank[2]),
  1204. interpreter_walk(state, node->c), 0, 0, state->at->rank[1],
  1205. state->at->rank[2]);
  1206. case N_FUN: {
  1207. unsigned int argc = 0;
  1208. function_collect_args(node->a, &argc);
  1209. verb_t *nv = verb_new();
  1210. if (argc > 0)
  1211. nv->is_fun = true;
  1212. nv->bonds = list_new();
  1213. nv->name = strdup_checked(argc == 0 ? ":..." : argc == 1 ? ":x" : ":xy");
  1214. nv->rank[0] = 0;
  1215. nv->rank[1] = 0;
  1216. nv->rank[2] = 0;
  1217. if (argc == 0) {
  1218. list_push(nv->bonds, interpreter_walk(state, node->a));
  1219. nv->monad = _const_monad;
  1220. nv->dyad = _const_dyad;
  1221. } else if (argc == 1) {
  1222. list_push(nv->bonds, node->a);
  1223. nv->monad = _fun_monad;
  1224. nv->dyad = NULL;
  1225. } else {
  1226. nv->monad = NULL;
  1227. list_push(nv->bonds, state->udf);
  1228. list_push(nv->bonds, node->a);
  1229. nv->dyad = _fun_dyad;
  1230. }
  1231. return value_new_verb(nv);
  1232. }
  1233. case N_MONAD:
  1234. return apply_monad(state, interpreter_walk(state, node->a),
  1235. interpreter_walk(state, node->b));
  1236. case N_DYAD:
  1237. return apply_dyad(state, interpreter_walk(state, node->a),
  1238. interpreter_walk(state, node->b),
  1239. interpreter_walk(state, node->c));
  1240. case N_ADV: {
  1241. value_t *v = interpreter_walk(state, node->a);
  1242. return value_new_verb(node->av->adverb(state, v));
  1243. }
  1244. case N_CONJ: {
  1245. value_t *v1 = interpreter_walk(state, node->a);
  1246. value_t *v2 = interpreter_walk(state, node->b);
  1247. return value_new_verb(node->av->conjunction(state, v1, v2));
  1248. }
  1249. case N_PARTIAL_CONJ: {
  1250. verb_t *nv = verb_new();
  1251. value_t *a = interpreter_walk(state, node->a);
  1252. char *r = value_show(a);
  1253. size_t l = strlen(r) + strlen(node->av->name) + 1;
  1254. nv->name = malloc_checked(l);
  1255. snprintf(nv->name, l, "%s%s", r, node->av->name);
  1256. GC_FREE(r);
  1257. nv->bonds = list_new();
  1258. list_push(nv->bonds, node->av);
  1259. list_push(nv->bonds, a);
  1260. nv->rank[0] = 0;
  1261. nv->rank[1] = 0;
  1262. nv->rank[2] = 0;
  1263. nv->monad = _partial_conjunction;
  1264. nv->dyad = NULL;
  1265. return value_new_verb(nv);
  1266. }
  1267. case N_FORK: {
  1268. value_t *_f = interpreter_walk(state, node->a);
  1269. if (_f->tag != VERB)
  1270. return state->udf;
  1271. value_t *_g = interpreter_walk(state, node->b);
  1272. if (_g->tag != VERB)
  1273. return state->udf;
  1274. value_t *_h = interpreter_walk(state, node->c);
  1275. if (_h->tag != VERB)
  1276. return state->udf;
  1277. verb_t *f = _f->val.verb;
  1278. verb_t *g = _g->val.verb;
  1279. verb_t *h = _h->val.verb;
  1280. verb_t *nv = verb_new();
  1281. nv->bonds = list_new();
  1282. list_push(nv->bonds, f);
  1283. list_push(nv->bonds, g);
  1284. list_push(nv->bonds, h);
  1285. size_t l = strlen(f->name) + strlen(g->name) + strlen(h->name) + 1;
  1286. nv->name = malloc_checked(l);
  1287. snprintf(nv->name, l, "%s%s%s", f->name, g->name, h->name);
  1288. nv->rank[0] = 0;
  1289. nv->rank[1] = 0;
  1290. nv->rank[2] = 0;
  1291. nv->monad = _fork_monad;
  1292. nv->dyad = _fork_dyad;
  1293. return value_new_verb(nv);
  1294. }
  1295. case N_HOOK: {
  1296. value_t *_f = interpreter_walk(state, node->a);
  1297. if (_f->tag != VERB)
  1298. return state->udf;
  1299. value_t *_g = interpreter_walk(state, node->b);
  1300. if (_g->tag != VERB)
  1301. return state->udf;
  1302. verb_t *f = _f->val.verb;
  1303. verb_t *g = _g->val.verb;
  1304. verb_t *nv = verb_new();
  1305. nv->bonds = list_new();
  1306. list_push(nv->bonds, f);
  1307. list_push(nv->bonds, g);
  1308. size_t l = strlen(f->name) + strlen(g->name) + 1;
  1309. nv->name = malloc_checked(l);
  1310. snprintf(nv->name, l, "%s%s", f->name, g->name);
  1311. nv->rank[0] = 0;
  1312. nv->rank[1] = 0;
  1313. nv->rank[2] = 0;
  1314. nv->monad = _hook_monad;
  1315. nv->dyad = _hook_dyad;
  1316. return value_new_verb(nv);
  1317. }
  1318. case N_BOND: {
  1319. value_t *_f = interpreter_walk(state, node->a);
  1320. if (_f->tag != VERB)
  1321. return state->udf;
  1322. value_t *g = interpreter_walk(state, node->b);
  1323. verb_t *f = _f->val.verb;
  1324. verb_t *nv = verb_new();
  1325. nv->bonds = list_new();
  1326. list_push(nv->bonds, f);
  1327. list_push(nv->bonds, g);
  1328. char *r = value_show(g);
  1329. size_t l = strlen(r) + strlen(f->name) + 1;
  1330. nv->name = malloc_checked(l);
  1331. snprintf(nv->name, l, "%s%s", r, f->name);
  1332. GC_FREE(r);
  1333. nv->rank[0] = 0;
  1334. nv->rank[1] = 0;
  1335. nv->rank[2] = 0;
  1336. nv->monad = _bond_monad;
  1337. nv->dyad = _bond_dyad;
  1338. return value_new_verb(nv);
  1339. }
  1340. case N_OVER: {
  1341. value_t *f = interpreter_walk(state, node->a);
  1342. value_t *_g = interpreter_walk(state, node->b);
  1343. if (_g->tag != VERB)
  1344. return state->udf;
  1345. value_t *_h = interpreter_walk(state, node->c);
  1346. if (_h->tag != VERB)
  1347. return state->udf;
  1348. verb_t *g = _g->val.verb;
  1349. verb_t *h = _h->val.verb;
  1350. verb_t *nv = verb_new();
  1351. nv->bonds = list_new();
  1352. list_push(nv->bonds, f);
  1353. list_push(nv->bonds, g);
  1354. list_push(nv->bonds, h);
  1355. char *r = value_show(f);
  1356. size_t l = strlen(r) + strlen(g->name) + strlen(h->name) + 1;
  1357. nv->name = malloc_checked(l);
  1358. snprintf(nv->name, l, "%s%s%s", r, g->name, h->name);
  1359. GC_FREE(r);
  1360. nv->rank[0] = 0;
  1361. nv->rank[1] = 0;
  1362. nv->rank[2] = 0;
  1363. nv->monad = _over_monad;
  1364. nv->dyad = _over_dyad;
  1365. return value_new_verb(nv);
  1366. }
  1367. case N_BIND: {
  1368. value_t *l = node->a->v;
  1369. node_t *b = node->b;
  1370. unsigned int argc = 0;
  1371. function_collect_args(b, &argc);
  1372. if (argc != 0)
  1373. b = node_new1(N_FUN, b);
  1374. value_t *r = interpreter_walk(state, b);
  1375. if (r->tag == VERB && argc == 0)
  1376. r->val.verb->mark = true;
  1377. value_t *ov = table_get(state->env, l->val.symbol);
  1378. if (ov && ov->tag == VERB && ov->val.verb->is_fun && r->tag == VERB && r->val.verb->is_fun) {
  1379. if (!ov->val.verb->monad && r->val.verb->monad) {
  1380. list_set(ov->val.verb->bonds, 0, r->val.verb->bonds->value);
  1381. ov->val.verb->monad = r->val.verb->monad;
  1382. break;
  1383. }
  1384. if (!ov->val.verb->dyad && r->val.verb->dyad) {
  1385. list_push(ov->val.verb->bonds, r->val.verb->bonds->next->value);
  1386. ov->val.verb->dyad = r->val.verb->dyad;
  1387. break;
  1388. }
  1389. }
  1390. table_set(state->env, l->val.symbol, r);
  1391. }
  1392. }
  1393. return state->nil;
  1394. }
  1395. value_t *verb_const(interpreter_t *state, verb_t *self, value_t *x) {
  1396. verb_t *nv = verb_new();
  1397. nv->bonds = list_new();
  1398. list_push(nv->bonds, x);
  1399. char *r = value_show(x);
  1400. size_t l = strlen(r) + 2;
  1401. nv->name = malloc_checked(l);
  1402. snprintf(nv->name, l, ":%s", r);
  1403. nv->rank[0] = 0;
  1404. nv->rank[1] = 0;
  1405. nv->rank[2] = 0;
  1406. nv->monad = _const_monad;
  1407. nv->dyad = _const_dyad;
  1408. return value_new_verb(nv);
  1409. }
  1410. value_t *verb_bind(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1411. if (x->tag == SYMBOL) {
  1412. if (y->tag == VERB)
  1413. y->val.verb->mark = true;
  1414. table_set(state->env, x->val.symbol, y);
  1415. }
  1416. return state->udf;
  1417. }
  1418. table_t *Inverses;
  1419. value_t *verb_obverse(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1420. if (x->tag == VERB && y->tag == VERB) {
  1421. verb_t *vx = x->val.verb;
  1422. if (!y->val.verb->monad)
  1423. return state->udf;
  1424. if (strcmp(vx->name, ":...") == 0 || strcmp(vx->name, ":x") == 0 || strcmp(vx->name, ":xy") == 0)
  1425. return state->udf;
  1426. if (table_has(Inverses, vx->name))
  1427. return state->udf;
  1428. table_set(Inverses, vx->name, y->val.verb);
  1429. return state->nil;
  1430. }
  1431. return state->udf;
  1432. }
  1433. value_t *verb_flip(interpreter_t *state, verb_t *self, value_t *x) {
  1434. if (x->tag != ARRAY || list_empty(x->val.array))
  1435. return state->udf;
  1436. list_t *t = x->val.array;
  1437. if (!is_arrays_array(t))
  1438. return state->udf;
  1439. list_t *r = list_new();
  1440. value_t *c0 = t->value;
  1441. list_t *c0t = c0->val.array;
  1442. size_t c0l = list_length(c0t);
  1443. for (size_t i = 0; i < c0l; i++) {
  1444. list_t *nc = list_new();
  1445. list_t *t2 = t;
  1446. while (t2) {
  1447. value_t *rw = t2->value;
  1448. list_t *rwt = rw->val.array;
  1449. if (list_empty(rwt))
  1450. return state->udf;
  1451. value_t *v = list_index(rwt, i);
  1452. if (!v)
  1453. v = rwt->value;
  1454. list_push(nc, v);
  1455. t2 = t2->next;
  1456. }
  1457. list_push(r, value_new_array(nc));
  1458. }
  1459. return value_new_array(r);
  1460. }
  1461. value_t *verb_plus(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1462. if ((x->tag == NUMBER || x->tag == CHAR) &&
  1463. (y->tag == NUMBER || y->tag == CHAR)) {
  1464. if (x->tag == CHAR || y->tag == CHAR)
  1465. return value_new_char(get_numeric(x) + get_numeric(y));
  1466. return value_new_number(get_numeric(x) + get_numeric(y));
  1467. }
  1468. return _NAN;
  1469. }
  1470. value_t *verb_sign(interpreter_t *state, verb_t *self, value_t *x) {
  1471. if (x->tag == NUMBER)
  1472. return x->val.number < 0? NNUMS[0]: x->val.number > 0? NUMS[1]: NUMS[0];
  1473. return _NAN;
  1474. }
  1475. double gcd(double a, double b) {
  1476. if (b != 0)
  1477. return gcd(b, fmod(a, b));
  1478. else
  1479. return fabs(a);
  1480. }
  1481. value_t *verb_gcd(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1482. if (x->tag == NUMBER && y->tag == NUMBER)
  1483. return value_new_number(gcd(x->val.number, y->val.number));
  1484. return _NAN;
  1485. }
  1486. value_t *verb_sin(interpreter_t *state, verb_t *self, value_t *x) {
  1487. if (x->tag == NUMBER)
  1488. return value_new_number(sin(x->val.number));
  1489. return _NAN;
  1490. }
  1491. value_t *verb_square(interpreter_t *state, verb_t *self, value_t *x) {
  1492. if (x->tag == NUMBER)
  1493. return value_new_number(x->val.number * x->val.number);
  1494. return _NAN;
  1495. }
  1496. value_t *verb_negate(interpreter_t *state, verb_t *self, value_t *x) {
  1497. if (x->tag == NUMBER)
  1498. return value_new_number(-x->val.number);
  1499. return _NAN;
  1500. }
  1501. value_t *verb_minus(interpreter_t *state, verb_t *self, value_t *x,
  1502. value_t *y) {
  1503. if ((x->tag == NUMBER || x->tag == CHAR) &&
  1504. (y->tag == NUMBER || y->tag == CHAR)) {
  1505. if (x->tag == CHAR || y->tag == CHAR)
  1506. return value_new_char(get_numeric(x) - get_numeric(y));
  1507. return value_new_number(get_numeric(x) - get_numeric(y));
  1508. }
  1509. return _NAN;
  1510. }
  1511. value_t *verb_atan(interpreter_t *state, verb_t *self, value_t *x) {
  1512. if (x->tag == NUMBER)
  1513. return value_new_number(atan(x->val.number));
  1514. return _NAN;
  1515. }
  1516. value_t *verb_atan2(interpreter_t *state, verb_t *self, value_t *x,
  1517. value_t *y) {
  1518. if (x->tag == NUMBER && y->tag == NUMBER)
  1519. return value_new_number(atan2(x->val.number, y->val.number));
  1520. return _NAN;
  1521. }
  1522. value_t *verb_first(interpreter_t *state, verb_t *self, value_t *x) {
  1523. if (x->tag != ARRAY)
  1524. return x;
  1525. if (list_empty(x->val.array))
  1526. return state->udf;
  1527. return x->val.array->value;
  1528. }
  1529. value_t *verb_times(interpreter_t *state, verb_t *self, value_t *x,
  1530. value_t *y) {
  1531. if ((x->tag == NUMBER || x->tag == CHAR) &&
  1532. (y->tag == NUMBER || y->tag == CHAR)) {
  1533. if (x->tag == CHAR || y->tag == CHAR)
  1534. return value_new_char(get_numeric(x) * get_numeric(y));
  1535. return value_new_number(get_numeric(x) * get_numeric(y));
  1536. }
  1537. return _NAN;
  1538. }
  1539. double lcm(double a, double b) { return (a * b) / gcd(a, b); }
  1540. uint64_t factorial(uint64_t n) {
  1541. uint64_t r = 1;
  1542. while (n > 0)
  1543. r *= n--;
  1544. return r;
  1545. }
  1546. value_t *verb_factorial(interpreter_t *state, verb_t *self, value_t *x) {
  1547. if (x->tag == NUMBER)
  1548. return value_new_number(factorial((uint64_t)fabs(x->val.number)));
  1549. return _NAN;
  1550. }
  1551. value_t *verb_lcm(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1552. if (x->tag == NUMBER && y->tag == NUMBER)
  1553. return value_new_number(lcm(x->val.number, y->val.number));
  1554. return _NAN;
  1555. }
  1556. value_t *verb_double(interpreter_t *state, verb_t *self, value_t *x) {
  1557. if (x->tag == NUMBER)
  1558. return value_new_number(x->val.number * 2);
  1559. return _NAN;
  1560. }
  1561. value_t *verb_replicate(interpreter_t *state, verb_t *self, value_t *x,
  1562. value_t *y) {
  1563. if (x->tag == NUMBER) {
  1564. size_t k = fabs(x->val.number);
  1565. list_t *r = list_new();
  1566. while (k--)
  1567. list_push(r, y);
  1568. return value_new_array(r);
  1569. }
  1570. return state->udf;
  1571. }
  1572. value_t *verb_reciprocal(interpreter_t *state, verb_t *self, value_t *x) {
  1573. if (x->tag == NUMBER)
  1574. return value_new_number(1 / x->val.number);
  1575. return _NAN;
  1576. }
  1577. value_t *verb_divide(interpreter_t *state, verb_t *self, value_t *x,
  1578. value_t *y) {
  1579. if (x->tag == NUMBER && y->tag == NUMBER) {
  1580. double ny = y->val.number;
  1581. if (ny == 0)
  1582. return INF;
  1583. return value_new_number(x->val.number / ny);
  1584. }
  1585. return _NAN;
  1586. }
  1587. double npower(double base, int n) {
  1588. if (n < 0)
  1589. return npower(1 / base, -n);
  1590. else if (n == 0)
  1591. return 1.0;
  1592. else if (n == 1)
  1593. return base;
  1594. else if (n % 2)
  1595. return base * npower(base * base, n / 2);
  1596. else
  1597. return npower(base * base, n / 2);
  1598. }
  1599. double nroot(double base, int n) {
  1600. if (n == 1)
  1601. return base;
  1602. else if (n <= 0 || base < 0)
  1603. return NAN;
  1604. else {
  1605. double delta, x = base / n;
  1606. do {
  1607. delta = (base / npower(x, n - 1) - x) / n;
  1608. x += delta;
  1609. } while (fabs(delta) >= 1e-8);
  1610. return x;
  1611. }
  1612. }
  1613. value_t *verb_sqrt(interpreter_t *state, verb_t *self, value_t *x) {
  1614. if (x->tag == NUMBER)
  1615. return value_new_number(sqrt(x->val.number));
  1616. return _NAN;
  1617. }
  1618. value_t *verb_root(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1619. if (x->tag == NUMBER && y->tag == NUMBER)
  1620. return value_new_number(nroot(y->val.number, x->val.number));
  1621. return _NAN;
  1622. }
  1623. value_t *verb_halve(interpreter_t *state, verb_t *self, value_t *x) {
  1624. if (x->tag == NUMBER)
  1625. return value_new_number(x->val.number / 2);
  1626. return _NAN;
  1627. }
  1628. value_t *verb_idivide(interpreter_t *state, verb_t *self, value_t *x,
  1629. value_t *y) {
  1630. if (x->tag == NUMBER && y->tag == NUMBER) {
  1631. double ny = y->val.number;
  1632. if (ny == 0)
  1633. return INF;
  1634. return value_new_number(trunc(x->val.number / ny));
  1635. }
  1636. return _NAN;
  1637. }
  1638. value_t *verb_enlist(interpreter_t *state, verb_t *self, value_t *x);
  1639. value_t *verb_pred(interpreter_t *state, verb_t *self, value_t *x);
  1640. value_t *verb_range(interpreter_t *state, verb_t *self, value_t *x, value_t *y);
  1641. value_t *verb_enum(interpreter_t *state, verb_t *self, value_t *x) {
  1642. if (value_equals(x, NUMS[1]))
  1643. return verb_enlist(state, NULL, NUMS[0]);
  1644. else if (value_equals(x, NUMS[0]))
  1645. return state->unit;
  1646. return verb_range(state, self, NUMS[0], verb_pred(state, self, x));
  1647. }
  1648. value_t *verb_mod(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1649. if (x->tag == NUMBER && y->tag == NUMBER) {
  1650. double ny = y->val.number;
  1651. if (ny == 0)
  1652. return _NAN;
  1653. return value_new_number(fmod(x->val.number, ny));
  1654. }
  1655. return _NAN;
  1656. }
  1657. value_t *verb_take(interpreter_t *state, verb_t *self, value_t *x, value_t *y);
  1658. value_t *verb_drop(interpreter_t *state, verb_t *self, value_t *x, value_t *y);
  1659. bool is_bad_num(double v) {
  1660. return isnan(v) || v == INFINITY || v == -INFINITY;
  1661. }
  1662. value_t *verb_odometer(interpreter_t *state, verb_t *self, value_t *x) {
  1663. if (x->tag != ARRAY)
  1664. x = verb_enlist(state, NULL, x);
  1665. else if (list_empty(x->val.array) || !x->val.array->next)
  1666. return state->udf;
  1667. size_t p = 1;
  1668. size_t xl = 0;
  1669. list_t *t = x->val.array;
  1670. while (t) {
  1671. value_t *it = t->value;
  1672. if (it->tag != NUMBER || is_bad_num(it->val.number))
  1673. return state->udf;
  1674. p *= (size_t)(it->val.number);
  1675. t = t->next; xl++;
  1676. }
  1677. if (p < 1)
  1678. return state->unit;
  1679. t = x->val.array;
  1680. uint64_t *lims = malloc_checked_atomic(sizeof(uint64_t) * xl);
  1681. for (size_t i = 0; i < xl; i++) {
  1682. lims[i] = (size_t)(((value_t *)t->value)->val.number);
  1683. t = t->next;
  1684. }
  1685. uint64_t **z = malloc_checked(sizeof(uint64_t *) * p);
  1686. for (size_t i = 0; i < p; i++)
  1687. z[i] = malloc_checked_atomic(sizeof(uint64_t) * xl);
  1688. for (size_t i = 0; i < p-1; i++) {
  1689. uint64_t *r = z[i];
  1690. uint64_t *s = z[i + 1];
  1691. bool carry = true;
  1692. for (size_t j = 0; j < xl; j++) {
  1693. uint64_t a = xl-1-j;
  1694. s[a] = r[a];
  1695. if (carry) {
  1696. s[a]++; carry = false;
  1697. }
  1698. if (s[a] >= lims[a]) {
  1699. s[a] = 0; carry = true;
  1700. }
  1701. }
  1702. }
  1703. GC_FREE(lims);
  1704. list_t *r = list_new();
  1705. for (size_t i = 0; i < p; i++) {
  1706. list_t *rw = list_new();
  1707. for (size_t j = 0; j < xl; j++)
  1708. list_push(rw, value_new_number(z[i][j]));
  1709. list_push(r, value_new_array(rw));
  1710. GC_FREE(z[i]);
  1711. }
  1712. GC_FREE(z);
  1713. return value_new_array(r);
  1714. }
  1715. value_t *verb_chunks(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1716. if (x->tag != NUMBER)
  1717. return state->udf;
  1718. if (y->tag != ARRAY)
  1719. y = verb_enlist(state, NULL, y);
  1720. else if (list_empty(y->val.array))
  1721. return y;
  1722. list_t *r = list_new();
  1723. size_t l = list_length(y->val.array);
  1724. size_t cl = fabs(x->val.number);
  1725. for (size_t i = 0; i < l; i += cl)
  1726. list_push(r, verb_take(state, NULL, value_new_number(cl), verb_drop(state, NULL, value_new_number(i), y)));
  1727. return value_new_array(r);
  1728. }
  1729. value_t *verb_exp(interpreter_t *state, verb_t *self, value_t *x) {
  1730. if (x->tag == NUMBER)
  1731. return value_new_number(exp(x->val.number));
  1732. return _NAN;
  1733. }
  1734. value_t *verb_power(interpreter_t *state, verb_t *self, value_t *x,
  1735. value_t *y) {
  1736. if (x->tag == NUMBER && y->tag == NUMBER)
  1737. return value_new_number(pow(x->val.number, y->val.number));
  1738. return _NAN;
  1739. }
  1740. value_t *verb_nlog(interpreter_t *state, verb_t *self, value_t *x) {
  1741. if (x->tag == NUMBER)
  1742. return value_new_number(log(x->val.number));
  1743. return _NAN;
  1744. }
  1745. value_t *verb_log(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1746. if (x->tag == NUMBER && y->tag == NUMBER)
  1747. return value_new_number(log(y->val.number) / log(x->val.number));
  1748. return _NAN;
  1749. }
  1750. int bits_needed(uint32_t value) {
  1751. int bits = 0;
  1752. for (int bit_test = 16; bit_test > 0; bit_test >>= 1) {
  1753. if (value >> bit_test != 0) {
  1754. bits += bit_test;
  1755. value >>= bit_test;
  1756. }
  1757. }
  1758. return bits + value;
  1759. }
  1760. value_t *verb_bits(interpreter_t *state, verb_t *self, value_t *x) {
  1761. if (x->tag == NUMBER) {
  1762. int n = x->val.number;
  1763. int bk = bits_needed(n);
  1764. list_t *r = list_new();
  1765. for (int i = 0; i < bk; i++)
  1766. if ((n & (1 << i)) >> i)
  1767. list_push(r, NUMS[1]);
  1768. else
  1769. list_push(r, NUMS[0]);
  1770. return value_new_array(r);
  1771. }
  1772. return state->udf;
  1773. }
  1774. value_t *verb_base(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  1775. if (x->tag == NUMBER && y->tag == NUMBER) {
  1776. size_t v = fabs(y->val.number);
  1777. size_t b = fabs(x->val.number);
  1778. if (b < 2)
  1779. return state->udf;
  1780. list_t *r = list_new();
  1781. while (v > 0) {
  1782. r = list_insert(&r, 0, value_new_number(v % b));
  1783. v /= b;
  1784. }
  1785. return value_new_array(r);
  1786. }
  1787. return state->udf;
  1788. }
  1789. ssize_t indexOf(list_t *l, value_t *x) {
  1790. if (list_empty(l))
  1791. return -1;
  1792. size_t i = 0;
  1793. while (l) {
  1794. if (value_equals(l->value, x))
  1795. return i;
  1796. l = l->next;
  1797. i++;
  1798. }
  1799. return -1;
  1800. }
  1801. value_t *verb_group(interpreter_t *state, verb_t *self, value_t *x) {
  1802. if (x->tag != ARRAY)
  1803. x = verb_enlist(state, NULL, x);
  1804. else if (list_empty(x->val.array))
  1805. return x;
  1806. list_t *r = list_new();
  1807. list_t *is = list_new();
  1808. size_t i = 0;
  1809. list_t *t = x->val.array;
  1810. while (t) {
  1811. value_t *v = t->value;
  1812. ssize_t n = indexOf(is, v);
  1813. if (n < 0) {
  1814. list_push(r, verb_enlist(state, NULL, value_new_number(i)));
  1815. list_push(is, v);
  1816. } else {
  1817. value_t *tmp = list_index(r, n);
  1818. list_push(tmp->val.array, value_new_number(i));
  1819. }
  1820. t = t->next;
  1821. i++;
  1822. }
  1823. while (is) {
  1824. list_t *tmp = is->next;
  1825. GC_FREE(is);
  1826. is = tmp;
  1827. }
  1828. return value_new_array(r);
  1829. }
  1830. value_t *verb_buckets(interpreter_t *state, verb_t *self, value_t *x,
  1831. value_t *y) {
  1832. if (x->tag != ARRAY)
  1833. x = verb_enlist(state, NULL, x);
  1834. else if (list_empty(x->val.array))
  1835. return y;
  1836. if (y->tag != ARRAY)
  1837. y = verb_enlist(state, NULL, x);
  1838. else if (list_empty(y->val.array))
  1839. return y;
  1840. list_t *r = list_new();
  1841. list_t *t = x->val.array;
  1842. size_t mx = 0;
  1843. while (t) {
  1844. value_t *v = t->value;
  1845. if (v->tag != NUMBER)
  1846. break;
  1847. ssize_t i = v->val.number;
  1848. if (i >= 0 && i > mx)
  1849. mx = i;
  1850. t = t->next;
  1851. }
  1852. for (size_t i = 0; i < mx+1; i++)
  1853. list_push(r, list_new());
  1854. if (list_empty(r)) {
  1855. GC_FREE(r);
  1856. return state->unit;
  1857. }
  1858. list_t *ty = y->val.array;
  1859. t = x->val.array;
  1860. while (t && ty) {
  1861. value_t *v = t->value;
  1862. if (v->tag != NUMBER)
  1863. break;
  1864. ssize_t i = v->val.number;
  1865. if (i >= 0) {
  1866. list_t *b = list_index(r, i);
  1867. if (b)
  1868. list_push(b, ty->value);
  1869. }
  1870. t = t->next; ty = ty->next;
  1871. }
  1872. if (ty) {
  1873. list_t *lb = list_new();
  1874. while (ty) {
  1875. list_push(lb, ty->value);
  1876. ty = ty->next;
  1877. }
  1878. list_push(r, lb);
  1879. }
  1880. t = r;
  1881. while (t) {
  1882. t->value = value_new_array(t->value);
  1883. t = t->next;
  1884. }
  1885. return value_new_array(r);
  1886. }
  1887. value_t *verb_equals(interpreter_t *state, verb_t *self, value_t *x,
  1888. value_t *y) {
  1889. return value_equals(x, y) ? NUMS[1] : NUMS[0];
  1890. }
  1891. value_t *verb_permute(interpreter_t *state, verb_t *self, value_t *x) {
  1892. if (x->tag != ARRAY || list_empty(x->val.array) || !x->val.array->next)
  1893. return x;
  1894. list_t* permutation = list_copy(x->val.array);
  1895. size_t length = list_length(permutation);
  1896. list_t *result = list_new();
  1897. list_push(result, list_copy(permutation));
  1898. list_t *c = list_new();
  1899. for (size_t i = 0; i < length; i++) {
  1900. size_t *n = malloc_checked_atomic(sizeof(size_t));
  1901. list_push(c, n);
  1902. }
  1903. size_t k;
  1904. list_t *p;
  1905. size_t i = 0;
  1906. while (i < length) {
  1907. size_t *n = list_index(c, i);
  1908. if ((*n) < i) {
  1909. k = i % 2 && (*n);
  1910. p = list_index(permutation, i);
  1911. list_set(permutation, i, list_index(permutation, k));
  1912. list_set(permutation, k, p);
  1913. *n = (*n) + 1;
  1914. i = 1;
  1915. list_push(result, list_copy(permutation));
  1916. } else {
  1917. *n = 0;
  1918. i++;
  1919. }
  1920. }
  1921. while (c) {
  1922. list_t *tmp = c->next;
  1923. GC_FREE(c->value);
  1924. GC_FREE(c);
  1925. c = tmp;
  1926. }
  1927. while (permutation) {
  1928. list_t *tmp = permutation->next;
  1929. GC_FREE(permutation);
  1930. permutation = tmp;
  1931. }
  1932. list_t *t = result;
  1933. while (t) {
  1934. t->value = value_new_array(t->value);
  1935. t = t->next;
  1936. }
  1937. return value_new_array(result);
  1938. }
  1939. value_t *verb_occurences(interpreter_t *state, verb_t *self, value_t *x) {
  1940. if (x->tag != ARRAY)
  1941. x = verb_enlist(state, NULL, x);
  1942. else if (list_empty(x->val.array))
  1943. return x;
  1944. list_t *table = list_new();
  1945. list_t *r = list_new();
  1946. list_t *t = x->val.array;
  1947. while (t) {
  1948. bool f = false;
  1949. value_t *it = t->value;
  1950. list_t *tt = table;
  1951. if (!list_empty(tt))
  1952. while (tt) {
  1953. list_t *p = tt->value;
  1954. if (value_equals(p->value, it)) {
  1955. size_t *n = p->next->value;
  1956. *n = (*n) + 1;
  1957. list_push(r, value_new_number(*n));
  1958. f = true;
  1959. break;
  1960. }
  1961. tt = tt->next;
  1962. }
  1963. if (!f) {
  1964. list_t *p = list_new();
  1965. list_push(p, it);
  1966. size_t *n = malloc_checked_atomic(sizeof(size_t));
  1967. list_push(p, n);
  1968. list_push(table, p);
  1969. list_push(r, NUMS[0]);
  1970. }
  1971. t = t->next;
  1972. }
  1973. if (!list_empty(table)) {
  1974. t = table;
  1975. while (t) {
  1976. list_t *tmp = t->next;
  1977. list_t *p = t->value;
  1978. GC_FREE(p->next->value);
  1979. GC_FREE(p->next);
  1980. GC_FREE(p);
  1981. GC_FREE(t);
  1982. t = tmp;
  1983. }
  1984. }
  1985. return value_new_array(r);
  1986. }
  1987. value_t *verb_mask(interpreter_t *state, verb_t *self, value_t *x,
  1988. value_t *y) {
  1989. if (x->tag != ARRAY)
  1990. x = verb_enlist(state, NULL, x);
  1991. else if (list_empty(x->val.array))
  1992. return x;
  1993. if (y->tag != ARRAY)
  1994. y = verb_enlist(state, NULL, y);
  1995. list_t *r = list_new();
  1996. value_t *l = value_new_number(list_length(y->val.array));
  1997. size_t n = 0;
  1998. size_t k = list_length(x->val.array);
  1999. for (size_t i = 0; i < k; i++) {
  2000. value_t *s = verb_take(state, NULL, l, verb_drop(state, NULL, value_new_number(i), x));
  2001. if (value_equals(s, y)) {
  2002. n++;
  2003. for (size_t j = 0; j < l->val.number; j++, i++)
  2004. list_push(r, value_new_number(n));
  2005. i--;
  2006. } else list_push(r, NUMS[0]);
  2007. }
  2008. return value_new_array(r);
  2009. }
  2010. value_t *verb_classify(interpreter_t *state, verb_t *self, value_t *x) {
  2011. if (x->tag != ARRAY)
  2012. x = verb_enlist(state, NULL, x);
  2013. else if (list_empty(x->val.array))
  2014. return x;
  2015. list_t *table = list_new();
  2016. list_t *r = list_new();
  2017. list_t *t = x->val.array;
  2018. size_t i = 0;
  2019. while (t) {
  2020. bool f = false;
  2021. value_t *it = t->value;
  2022. list_t *tt = table;
  2023. if (!list_empty(tt))
  2024. while (tt) {
  2025. list_t *p = tt->value;
  2026. if (value_equals(p->value, it)) {
  2027. size_t *n = p->next->value;
  2028. list_push(r, value_new_number(*n));
  2029. f = true;
  2030. break;
  2031. }
  2032. tt = tt->next;
  2033. }
  2034. if (!f) {
  2035. list_t *p = list_new();
  2036. list_push(p, it);
  2037. size_t *n = malloc_checked_atomic(sizeof(size_t));
  2038. *n = i++;
  2039. list_push(p, n);
  2040. list_push(table, p);
  2041. list_push(r, value_new_number(*n));
  2042. }
  2043. t = t->next;
  2044. }
  2045. if (!list_empty(table)) {
  2046. t = table;
  2047. while (t) {
  2048. list_t *tmp = t->next;
  2049. list_t *p = t->value;
  2050. GC_FREE(p->next->value);
  2051. GC_FREE(p->next);
  2052. GC_FREE(p);
  2053. GC_FREE(t);
  2054. t = tmp;
  2055. }
  2056. }
  2057. return value_new_array(r);
  2058. }
  2059. value_t *verb_unbits(interpreter_t *state, verb_t *self, value_t *x) {
  2060. if (x->tag != ARRAY)
  2061. x = verb_enlist(state, NULL, x);
  2062. int n = 0;
  2063. int i = 0;
  2064. list_t *t = x->val.array;
  2065. while (t) {
  2066. if (value_is_truthy(t->value))
  2067. n |= (int)1 << i;
  2068. else
  2069. n &= ~((int)1 << i);
  2070. t = t->next;
  2071. i++;
  2072. }
  2073. return value_new_number(n);
  2074. }
  2075. value_t *verb_unbase(interpreter_t *state, verb_t *self, value_t *x,
  2076. value_t *y) {
  2077. if (x->tag == NUMBER) {
  2078. size_t b = fabs(x->val.number);
  2079. if (b < 2)
  2080. return state->udf;
  2081. if (y->tag != ARRAY)
  2082. y = verb_enlist(state, NULL, y);
  2083. size_t n = 0;
  2084. list_t *t = y->val.array;
  2085. if (list_empty(t))
  2086. return state->udf;
  2087. while (t) {
  2088. value_t *v = t->value;
  2089. if (v->tag != NUMBER)
  2090. break;
  2091. size_t k = fabs(v->val.number);
  2092. n = n * b + k;
  2093. t = t->next;
  2094. }
  2095. return value_new_number(n);
  2096. }
  2097. return state->udf;
  2098. }
  2099. value_t *verb_not(interpreter_t *state, verb_t *self, value_t *x) {
  2100. return value_is_truthy(x) ? NUMS[0] : NUMS[1];
  2101. }
  2102. value_t *verb_not_equals(interpreter_t *state, verb_t *self, value_t *x,
  2103. value_t *y) {
  2104. return !value_equals(x, y) ? NUMS[1] : NUMS[0];
  2105. }
  2106. value_t *verb_pred(interpreter_t *state, verb_t *self, value_t *x) {
  2107. if (x->tag == NUMBER)
  2108. return value_new_number(x->val.number - 1);
  2109. else if (x->tag == CHAR)
  2110. return value_new_char(x->val._char - 1);
  2111. return _NAN;
  2112. }
  2113. value_t *verb_less(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2114. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2115. (y->tag == NUMBER || y->tag == CHAR)) {
  2116. if (get_numeric(x) < get_numeric(y))
  2117. return NUMS[1];
  2118. return NUMS[0];
  2119. }
  2120. return _NAN;
  2121. }
  2122. value_t *verb_floor(interpreter_t *state, verb_t *self, value_t *x) {
  2123. if (x->tag == NUMBER)
  2124. return value_new_number(floor(x->val.number));
  2125. return _NAN;
  2126. }
  2127. bool _compare_up(void *a, void *b) {
  2128. value_t *x = ((list_t *)a)->value;
  2129. value_t *y = ((list_t *)b)->value;
  2130. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2131. (y->tag == NUMBER || y->tag == CHAR)) {
  2132. if (get_numeric(x) > get_numeric(y))
  2133. return true;
  2134. return false;
  2135. }
  2136. return false;
  2137. }
  2138. bool _compare_down(void *a, void *b) {
  2139. value_t *x = ((list_t *)a)->value;
  2140. value_t *y = ((list_t *)b)->value;
  2141. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2142. (y->tag == NUMBER || y->tag == CHAR)) {
  2143. if (get_numeric(x) < get_numeric(y))
  2144. return true;
  2145. return false;
  2146. }
  2147. return false;
  2148. }
  2149. value_t *_grade(value_t *x, bool down) {
  2150. if (x->tag != ARRAY || list_empty(x->val.array) || !x->val.array->next)
  2151. return x;
  2152. size_t i = 0;
  2153. list_t *ps = list_new();
  2154. list_t *t = x->val.array;
  2155. while (t) {
  2156. list_t *p = list_new();
  2157. list_push(p, t->value);
  2158. list_push(p, value_new_number(i++));
  2159. list_push(ps, p);
  2160. t = t->next;
  2161. }
  2162. ps = list_sort(ps, down ? _compare_down : _compare_up);
  2163. t = ps;
  2164. while (t) {
  2165. list_t *p = t->value;
  2166. t->value = p->next->value;
  2167. GC_FREE(p->next);
  2168. GC_FREE(p);
  2169. t = t->next;
  2170. }
  2171. return value_new_array(ps);
  2172. }
  2173. value_t *verb_gradedown(interpreter_t *state, verb_t *self, value_t *x) {
  2174. return _grade(x, true);
  2175. }
  2176. value_t *verb_nudge_left(interpreter_t *state, verb_t *self, value_t *x,
  2177. value_t *y) {
  2178. if (y->tag != ARRAY)
  2179. return verb_enlist(state, NULL, x);
  2180. else if (list_empty(y->val.array))
  2181. return y;
  2182. else if (!y->val.array->next)
  2183. return verb_enlist(state, NULL, x);
  2184. list_t *r = list_new();
  2185. list_t *t = y->val.array->next;
  2186. while (t) {
  2187. list_push(r, t->value);
  2188. t = t->next;
  2189. }
  2190. list_push(r, x);
  2191. return value_new_array(r);
  2192. }
  2193. value_t *verb_lesseq(interpreter_t *state, verb_t *self, value_t *x,
  2194. value_t *y) {
  2195. if (value_equals(x, y))
  2196. return NUMS[1];
  2197. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2198. (y->tag == NUMBER || y->tag == CHAR)) {
  2199. if (get_numeric(x) < get_numeric(y))
  2200. return NUMS[1];
  2201. return NUMS[0];
  2202. }
  2203. return _NAN;
  2204. }
  2205. value_t *verb_succ(interpreter_t *state, verb_t *self, value_t *x) {
  2206. if (x->tag == NUMBER)
  2207. return value_new_number(x->val.number + 1);
  2208. else if (x->tag == CHAR)
  2209. return value_new_char(x->val._char + 1);
  2210. return _NAN;
  2211. }
  2212. value_t *verb_ceil(interpreter_t *state, verb_t *self, value_t *x) {
  2213. if (x->tag == NUMBER)
  2214. return value_new_number(ceil(x->val.number));
  2215. return _NAN;
  2216. }
  2217. value_t *verb_greater(interpreter_t *state, verb_t *self, value_t *x,
  2218. value_t *y) {
  2219. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2220. (y->tag == NUMBER || y->tag == CHAR)) {
  2221. if (get_numeric(x) > get_numeric(y))
  2222. return NUMS[1];
  2223. return NUMS[0];
  2224. }
  2225. return _NAN;
  2226. }
  2227. value_t *verb_greatereq(interpreter_t *state, verb_t *self, value_t *x,
  2228. value_t *y) {
  2229. if (value_equals(x, y))
  2230. return NUMS[1];
  2231. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2232. (y->tag == NUMBER || y->tag == CHAR)) {
  2233. if (get_numeric(x) > get_numeric(y))
  2234. return NUMS[1];
  2235. return NUMS[0];
  2236. }
  2237. return _NAN;
  2238. }
  2239. value_t *verb_gradeup(interpreter_t *state, verb_t *self, value_t *x) {
  2240. return _grade(x, false);
  2241. }
  2242. value_t *verb_nudge_right(interpreter_t *state, verb_t *self, value_t *x,
  2243. value_t *y) {
  2244. if (y->tag != ARRAY)
  2245. return verb_enlist(state, NULL, x);
  2246. else if (list_empty(y->val.array))
  2247. return y;
  2248. else if (!y->val.array->next)
  2249. return verb_enlist(state, NULL, x);
  2250. list_t *r = list_new();
  2251. list_push(r, x);
  2252. list_t *t = y->val.array;
  2253. while (t->next) {
  2254. list_push(r, t->value);
  2255. t = t->next;
  2256. }
  2257. return value_new_array(r);
  2258. }
  2259. value_t *verb_enlist(interpreter_t *state, verb_t *self, value_t *x) {
  2260. list_t *l = list_new();
  2261. list_push(l, x);
  2262. return value_new_array(l);
  2263. }
  2264. value_t *verb_join(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2265. list_t *l = list_new();
  2266. if (x->tag == ARRAY && !list_empty(x->val.array)) {
  2267. list_t *t = x->val.array;
  2268. while (t) {
  2269. list_push(l, t->value);
  2270. t = t->next;
  2271. }
  2272. } else
  2273. list_push(l, x);
  2274. if (y->tag == ARRAY && !list_empty(y->val.array)) {
  2275. list_t *t = y->val.array;
  2276. while (t) {
  2277. list_push(l, t->value);
  2278. t = t->next;
  2279. }
  2280. } else
  2281. list_push(l, y);
  2282. return value_new_array(l);
  2283. }
  2284. value_t *verb_enpair(interpreter_t *state, verb_t *self, value_t *x,
  2285. value_t *y) {
  2286. list_t *l = list_new();
  2287. list_push(l, x);
  2288. list_push(l, y);
  2289. return value_new_array(l);
  2290. }
  2291. value_t *verb_selfref1(interpreter_t *state, verb_t *self, value_t *x) {
  2292. verb_t *v;
  2293. if (!list_empty(state->args))
  2294. v = list_index(list_index(state->args, -1), -1);
  2295. else if (!list_empty(state->selfrefs))
  2296. v = list_index(state->selfrefs, -1);
  2297. else
  2298. return state->udf;
  2299. return each_rank(state, v, x, 0, v->rank[0]);
  2300. }
  2301. value_t *verb_selfref2(interpreter_t *state, verb_t *self, value_t *x,
  2302. value_t *y) {
  2303. verb_t *v;
  2304. if (!list_empty(state->args))
  2305. v = list_index(list_index(state->args, -1), -1);
  2306. else if (!list_empty(state->selfrefs))
  2307. v = list_index(state->selfrefs, -1);
  2308. else
  2309. return state->udf;
  2310. return together(state, v, x, y, 0, 0, v->rank[1], v->rank[2]);
  2311. }
  2312. value_t *verb_take(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2313. if (x->tag == NUMBER) {
  2314. if (y->tag != ARRAY) {
  2315. if (x->val.number == 0)
  2316. return state->unit;
  2317. else return x;
  2318. }
  2319. if (x->val.number == 0 || list_empty(y->val.array))
  2320. return state->unit;
  2321. bool rev = x->val.number < 0;
  2322. size_t k = (size_t)fabs(x->val.number);
  2323. list_t *t = y->val.array;
  2324. list_t *r = list_new();
  2325. if (rev)
  2326. for (ssize_t i = k; i > 0; i--) {
  2327. value_t *v = list_index(t, -i);
  2328. if (!v)
  2329. continue;
  2330. list_push(r, v);
  2331. }
  2332. else
  2333. while (t && k) {
  2334. list_push(r, t->value);
  2335. t = t->next;
  2336. k--;
  2337. }
  2338. return value_new_array(r);
  2339. }
  2340. return state->udf;
  2341. }
  2342. value_t *verb_where(interpreter_t *state, verb_t *self, value_t *x) {
  2343. if (x->tag != ARRAY)
  2344. x = verb_enlist(state, NULL, x);
  2345. else if (list_empty(x->val.array))
  2346. return x;
  2347. list_t *r = list_new();
  2348. list_t *t = x->val.array;
  2349. size_t i = 0;
  2350. while (t) {
  2351. value_t *a = t->value;
  2352. if (a->tag != NUMBER)
  2353. break;
  2354. size_t k = fabs(a->val.number);
  2355. for (size_t j = 0; j < k; j++)
  2356. list_push(r, value_new_number(i));
  2357. t = t->next;
  2358. i++;
  2359. }
  2360. return value_new_array(r);
  2361. }
  2362. value_t *verb_copy(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2363. if (x->tag != ARRAY)
  2364. x = verb_enlist(state, NULL, x);
  2365. if (y->tag != ARRAY)
  2366. y = verb_enlist(state, NULL, y);
  2367. list_t *tx = x->val.array;
  2368. list_t *ty = y->val.array;
  2369. if (list_empty(tx) || list_empty(ty))
  2370. return state->unit;
  2371. list_t *r = list_new();
  2372. while (tx) {
  2373. value_t *a = tx->value;
  2374. value_t *b = ty->value;
  2375. if (b->tag != NUMBER)
  2376. break;
  2377. size_t k = fabs(b->val.number);
  2378. for (size_t i = 0; i < k; i++)
  2379. list_push(r, a);
  2380. tx = tx->next;
  2381. if (ty->next)
  2382. ty = ty->next;
  2383. }
  2384. return value_new_array(r);
  2385. }
  2386. value_t *verb_nub(interpreter_t *state, verb_t *self, value_t *x) {
  2387. if (x->tag != ARRAY || list_empty(x->val.array))
  2388. return x;
  2389. list_t *n = list_new();
  2390. list_t *r = list_new();
  2391. list_t *t = x->val.array;
  2392. while (t) {
  2393. bool u = true;
  2394. list_t *t2 = r;
  2395. if (!list_empty(t2))
  2396. while (t2) {
  2397. if (value_equals(t->value, t2->value)) {
  2398. u = false;
  2399. break;
  2400. }
  2401. t2 = t2->next;
  2402. }
  2403. if (u)
  2404. list_push(r, t->value);
  2405. list_push(n, u ? NUMS[1] : NUMS[0]);
  2406. t = t->next;
  2407. }
  2408. while (r) {
  2409. list_t *tmp = r->next;
  2410. GC_FREE(r);
  2411. r = tmp;
  2412. }
  2413. return value_new_array(n);
  2414. }
  2415. value_t *verb_drop(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2416. if (x->tag == NUMBER) {
  2417. if (y->tag != ARRAY) {
  2418. if (x->val.number == 0)
  2419. return y;
  2420. else return state->unit;
  2421. }
  2422. if (x->val.number == 0)
  2423. return y;
  2424. if (list_empty(y->val.array))
  2425. return state->unit;
  2426. bool rev = x->val.number < 0;
  2427. size_t k = (size_t)fabs(x->val.number);
  2428. list_t *t = y->val.array;
  2429. if (rev) {
  2430. size_t l = list_length(t);
  2431. if (k >= l)
  2432. return state->unit;
  2433. return verb_take(state, NULL, value_new_number(l - k), y);
  2434. }
  2435. list_t *r = list_new();
  2436. while (t && k) {
  2437. t = t->next;
  2438. k--;
  2439. }
  2440. while (t) {
  2441. list_push(r, t->value);
  2442. t = t->next;
  2443. }
  2444. return value_new_array(r);
  2445. }
  2446. return state->udf;
  2447. }
  2448. value_t *verb_unique(interpreter_t *state, verb_t *self, value_t *x) {
  2449. if (x->tag != ARRAY || list_empty(x->val.array))
  2450. return x;
  2451. list_t *r = list_new();
  2452. list_t *t = x->val.array;
  2453. while (t) {
  2454. bool u = true;
  2455. list_t *t2 = r;
  2456. if (!list_empty(t2))
  2457. while (t2) {
  2458. if (value_equals(t->value, t2->value)) {
  2459. u = false;
  2460. break;
  2461. }
  2462. t2 = t2->next;
  2463. }
  2464. if (u)
  2465. list_push(r, t->value);
  2466. t = t->next;
  2467. }
  2468. return value_new_array(r);
  2469. }
  2470. value_t *verb_find(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2471. if (y->tag != ARRAY)
  2472. y = verb_enlist(state, self, y);
  2473. else if (list_empty(y->val.array))
  2474. return state->unit;
  2475. size_t i = 0;
  2476. list_t *r = list_new();
  2477. list_t *t = y->val.array;
  2478. while (t) {
  2479. if (value_equals(t->value, x))
  2480. list_push(r, value_new_number(i));
  2481. t = t->next;
  2482. i++;
  2483. }
  2484. return value_new_array(r);
  2485. }
  2486. value_t *verb_count(interpreter_t *state, verb_t *self, value_t *x) {
  2487. if (x->tag != ARRAY)
  2488. return NUMS[1];
  2489. return value_new_number(list_length(x->val.array));
  2490. }
  2491. void flatten(value_t *v, list_t *r) {
  2492. if (v->tag == ARRAY) {
  2493. list_t *t = v->val.array;
  2494. while (t) {
  2495. flatten(t->value, r);
  2496. t = t->next;
  2497. }
  2498. } else
  2499. list_push(r, v);
  2500. }
  2501. value_t *verb_flatten(interpreter_t *state, verb_t *self, value_t *x) {
  2502. if (x->tag != ARRAY || list_empty(x->val.array))
  2503. return x;
  2504. list_t *r = list_new();
  2505. flatten(x, r);
  2506. return value_new_array(r);
  2507. }
  2508. value_t *verb_minand(interpreter_t *state, verb_t *self, value_t *x,
  2509. value_t *y) {
  2510. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2511. (y->tag == NUMBER || y->tag == CHAR)) {
  2512. if (get_numeric(x) < get_numeric(y))
  2513. return x;
  2514. return y;
  2515. }
  2516. return _NAN;
  2517. }
  2518. value_t *verb_reverse(interpreter_t *state, verb_t *self, value_t *x) {
  2519. if (x->tag != ARRAY)
  2520. return x;
  2521. list_t *t = x->val.array;
  2522. if (list_empty(t))
  2523. return x;
  2524. list_t *r = list_new();
  2525. for (ssize_t i = list_length(t) - 1; i >= 0; i--)
  2526. list_push(r, list_index(t, i));
  2527. return value_new_array(r);
  2528. }
  2529. value_t *verb_maxor(interpreter_t *state, verb_t *self, value_t *x,
  2530. value_t *y) {
  2531. if ((x->tag == NUMBER || x->tag == CHAR) &&
  2532. (y->tag == NUMBER || y->tag == CHAR)) {
  2533. if (get_numeric(x) > get_numeric(y))
  2534. return x;
  2535. return y;
  2536. }
  2537. return _NAN;
  2538. }
  2539. value_t *verb_rotate(interpreter_t *state, verb_t *self, value_t *x,
  2540. value_t *y) {
  2541. if (y->tag != ARRAY || list_empty(y->val.array) || !y->val.array->next)
  2542. return x;
  2543. if (x->tag != NUMBER)
  2544. return state->udf;
  2545. bool rev = x->val.number < 0;
  2546. size_t k = fabs(x->val.number);
  2547. list_t *r = list_new();
  2548. list_t *t = y->val.array;
  2549. while (t) {
  2550. list_push(r, t->value);
  2551. t = t->next;
  2552. }
  2553. for (size_t i = 0; i < k; i++) {
  2554. value_t *v;
  2555. if (rev) {
  2556. v = r->value;
  2557. r = r->next;
  2558. list_push(r, v);
  2559. } else {
  2560. v = list_pop(r);
  2561. r = list_insert(&r, 0, v);
  2562. }
  2563. }
  2564. return value_new_array(r);
  2565. }
  2566. value_t *verb_windows(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2567. if (y->tag != ARRAY)
  2568. y = verb_enlist(state, NULL, y);
  2569. else if (list_empty(y->val.array))
  2570. return y;
  2571. size_t k = fabs(x->val.number);
  2572. size_t l = list_length(y->val.array);
  2573. list_t *r = list_new();
  2574. for (size_t i = 0; i < l; i++) {
  2575. if (i + k > l)
  2576. break;
  2577. list_push(r, verb_take(state, NULL, value_new_number(k), verb_drop(state, NULL, value_new_number(i), y)));
  2578. }
  2579. return value_new_array(r);
  2580. }
  2581. size_t depthOf(value_t *x, size_t d) {
  2582. if (x->tag == ARRAY) {
  2583. list_t *t = x->val.array;
  2584. if (list_empty(t))
  2585. return 0;
  2586. while (t) {
  2587. size_t d2 = depthOf(t->value, d + 1);
  2588. if (d2 > d)
  2589. d = d2;
  2590. t = t->next;
  2591. }
  2592. return d;
  2593. }
  2594. return 0;
  2595. }
  2596. value_t *verb_depth(interpreter_t *state, verb_t *self, value_t *x) {
  2597. return value_new_number(depthOf(x, 1));
  2598. }
  2599. value_t *verb_round(interpreter_t *state, verb_t *self, value_t *x) {
  2600. if (x->tag == NUMBER)
  2601. return value_new_number(round(x->val.number));
  2602. return _NAN;
  2603. }
  2604. value_t *verb_abs(interpreter_t *state, verb_t *self, value_t *x) {
  2605. if (x->tag == NUMBER)
  2606. return value_new_number(fabs(x->val.number));
  2607. return _NAN;
  2608. }
  2609. value_t *verb_tail(interpreter_t *state, verb_t *self, value_t *x);
  2610. value_t *verb_at(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2611. if (y->tag != NUMBER)
  2612. return state->udf;
  2613. if (x->tag != ARRAY) {
  2614. if (y->val.number > -1 && y->val.number < 1)
  2615. return x;
  2616. else
  2617. return state->udf;
  2618. }
  2619. if (list_empty(x->val.array))
  2620. return state->nil;
  2621. value_t *v = list_index(x->val.array, (ssize_t)y->val.number);
  2622. if (!v)
  2623. return state->udf;
  2624. return v;
  2625. }
  2626. value_t *verb_member(interpreter_t *state, verb_t *self, value_t *x,
  2627. value_t *y) {
  2628. if (y->tag != ARRAY)
  2629. y = verb_enlist(state, self, y);
  2630. else if (list_empty(y->val.array))
  2631. return NUMS[0];
  2632. list_t *t = y->val.array;
  2633. while (t) {
  2634. if (value_equals(t->value, x))
  2635. return NUMS[1];
  2636. t = t->next;
  2637. }
  2638. return NUMS[0];
  2639. }
  2640. value_t *verb_shuffle(interpreter_t *state, verb_t *self, value_t *x) {
  2641. if (x->tag != ARRAY)
  2642. x = verb_enlist(state, self, x);
  2643. else if (list_empty(x->val.array))
  2644. return x;
  2645. list_t *t = x->val.array;
  2646. size_t l = 0;
  2647. list_t *r = list_new();
  2648. while (t) {
  2649. list_push(r, t->value);
  2650. t = t->next; l++;
  2651. }
  2652. for (size_t i = 0; i < l; i++) {
  2653. size_t j = rand() % l;
  2654. value_t *tmp = list_index(r, i);
  2655. list_set(r, i, list_index(r, j));
  2656. list_set(r, j, tmp);
  2657. }
  2658. return value_new_array(r);
  2659. }
  2660. value_t *verb_head(interpreter_t *state, verb_t *self, value_t *x) {
  2661. return verb_take(state, NULL, NUMS[2], x);
  2662. }
  2663. value_t *verb_bin(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2664. if (x->tag != ARRAY)
  2665. x = verb_enlist(state, self, x);
  2666. else if (list_empty(x->val.array))
  2667. return x;
  2668. if (y->tag != ARRAY)
  2669. y = verb_enlist(state, self, x);
  2670. else if (list_empty(y->val.array))
  2671. return y;
  2672. size_t xl = list_length(x->val.array);
  2673. list_t *bins = list_new();
  2674. for (size_t i = 0; i < xl; i++) {
  2675. double s;
  2676. double e;
  2677. value_t *vs = list_index(x->val.array, i);
  2678. if (vs->tag == NUMBER)
  2679. s = vs->val.number;
  2680. else if (vs->tag == CHAR)
  2681. s = vs->val._char;
  2682. else return state->udf;
  2683. value_t *ve = i == xl - 1? value_new_number(s + 1): list_index(x->val.array, i + 1);
  2684. if (ve->tag == NUMBER)
  2685. e = fabs(ve->val.number);
  2686. else if (ve->tag == CHAR)
  2687. e = ve->val._char;
  2688. else return state->udf;
  2689. if (list_length(bins) > 0) {
  2690. list_t *pp = list_index(bins, -1);
  2691. double *pe = pp->value;
  2692. if (s <= (*pe))
  2693. return state->udf;
  2694. }
  2695. double *sn = malloc_checked(sizeof(double));
  2696. *sn = s;
  2697. double *en = malloc_checked(sizeof(double));
  2698. *en = e;
  2699. list_t *p = list_new();
  2700. list_push(p, sn);
  2701. list_push(p, en);
  2702. list_push(bins, p);
  2703. }
  2704. size_t bl = list_length(bins);
  2705. list_t *r = list_new();
  2706. size_t yl = list_length(y->val.array);
  2707. for (size_t i = 0; i < yl; i++) {
  2708. value_t *it = list_index(y->val.array, i);
  2709. double itv;
  2710. if (it->tag == NUMBER)
  2711. itv = it->val.number;
  2712. else if (it->tag == CHAR)
  2713. itv = it->val._char;
  2714. else return state->udf;
  2715. list_t *b = bins->value;
  2716. double *s = b->value;
  2717. if (itv < (*s)) {
  2718. list_push(r, NNUMS[0]);
  2719. continue;
  2720. }
  2721. b = list_index(bins, -1);
  2722. s = b->next->value;
  2723. if (itv >= (*s)) {
  2724. list_push(r, value_new_number(bl - 1));
  2725. continue;
  2726. }
  2727. double v = NAN;
  2728. for (size_t j = 0; j < bl; j++) {
  2729. b = list_index(bins, j);
  2730. double *s = b->value;
  2731. double *e = b->next->value;
  2732. if (itv >= (*s) && itv < (*e)) {
  2733. v = j; break;
  2734. }
  2735. }
  2736. if (!isnan(v))
  2737. list_push(r, value_new_number(v));
  2738. }
  2739. while (bins) {
  2740. list_t *tmp = bins->next;
  2741. list_t *b = bins->value;
  2742. GC_FREE(b->next->value);
  2743. GC_FREE(b->next);
  2744. GC_FREE(b->value);
  2745. GC_FREE(b);
  2746. GC_FREE(bins);
  2747. bins = tmp;
  2748. }
  2749. return value_new_array(r);
  2750. }
  2751. value_t *verb_tail(interpreter_t *state, verb_t *self, value_t *x) {
  2752. if (x->tag != ARRAY)
  2753. return x;
  2754. if (list_empty(x->val.array))
  2755. return state->udf;
  2756. return list_index(x->val.array, -1);
  2757. }
  2758. value_t *verb_cut(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2759. if (x->tag != ARRAY)
  2760. x = verb_enlist(state, self, x);
  2761. else if (list_empty(x->val.array))
  2762. return x;
  2763. if (y->tag != ARRAY)
  2764. y = verb_enlist(state, self, x);
  2765. else if (list_empty(y->val.array))
  2766. return x;
  2767. if (list_length(x->val.array) != 2)
  2768. return state->udf;
  2769. value_t *vs = x->val.array->value;
  2770. value_t *ve = x->val.array->next->value;
  2771. if (vs->tag != NUMBER || ve->tag != NUMBER)
  2772. return state->udf;
  2773. size_t s = fabs(vs->val.number);
  2774. size_t e = fabs(ve->val.number);
  2775. list_t *r = list_new();
  2776. size_t l = list_length(y->val.array);
  2777. list_t *pa = list_new();
  2778. for (size_t i = s; i < e && i < l; i++) {
  2779. value_t *v = list_index(y->val.array, i);
  2780. if (!v)
  2781. break;
  2782. list_push(pa, v);
  2783. }
  2784. list_t *pb = list_new();
  2785. for (size_t i = e; i < l; i++) {
  2786. value_t *v = list_index(y->val.array, i);
  2787. if (!v)
  2788. break;
  2789. list_push(pb, v);
  2790. }
  2791. list_push(r, value_new_array(pa));
  2792. list_push(r, value_new_array(pb));
  2793. return value_new_array(r);
  2794. }
  2795. value_t *verb_prefixes(interpreter_t *state, verb_t *self, value_t *x) {
  2796. if (x->tag != ARRAY)
  2797. x = verb_enlist(state, NULL, x);
  2798. list_t *r = list_new();
  2799. size_t i = 0;
  2800. list_t *t = x->val.array;
  2801. while (t) {
  2802. list_push(r, verb_take(state, NULL, value_new_number(i), x));
  2803. t = t->next;
  2804. i++;
  2805. }
  2806. list_push(r, x);
  2807. return value_new_array(r);
  2808. }
  2809. value_t *verb_behead(interpreter_t *state, verb_t *self, value_t *x) {
  2810. return verb_drop(state, NULL, NUMS[1], x);
  2811. }
  2812. value_t *verb_curtail(interpreter_t *state, verb_t *self, value_t *x) {
  2813. return verb_drop(state, NULL, NNUMS[0], x);
  2814. }
  2815. value_t *verb_suffixes(interpreter_t *state, verb_t *self, value_t *x) {
  2816. if (x->tag != ARRAY)
  2817. x = verb_enlist(state, NULL, x);
  2818. list_t *r = list_new();
  2819. size_t i = 0;
  2820. list_t *t = x->val.array;
  2821. while (t) {
  2822. list_push(r, verb_drop(state, NULL, value_new_number(i), x));
  2823. t = t->next;
  2824. i++;
  2825. }
  2826. list_push(r, state->unit);
  2827. return value_new_array(r);
  2828. }
  2829. value_t *verb_left(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  2830. return x;
  2831. }
  2832. value_t *verb_same(interpreter_t *state, verb_t *self, value_t *x) { return x; }
  2833. value_t *verb_right(interpreter_t *state, verb_t *self, value_t *x,
  2834. value_t *y) {
  2835. return y;
  2836. }
  2837. value_t *verb_symbol(interpreter_t *state, verb_t *self, value_t *x) {
  2838. char *s = value_show(x);
  2839. return value_new_symbol(s);
  2840. }
  2841. value_t *verb_apply1(interpreter_t *state, verb_t *self, value_t *x,
  2842. value_t *y) {
  2843. return apply_monad(state, x, y);
  2844. }
  2845. value_t *verb_apply2(interpreter_t *state, verb_t *self, value_t *x,
  2846. value_t *y) {
  2847. if (y->tag != ARRAY || list_empty(y->val.array) || !y->val.array->next)
  2848. return state->udf;
  2849. return apply_dyad(state, x, y->val.array->value, y->val.array->next->value);
  2850. }
  2851. value_t *verb_shape(interpreter_t *state, verb_t *self, value_t *x) {
  2852. if (x->tag != ARRAY || list_empty(x->val.array))
  2853. return state->unit;
  2854. if (!is_arrays_array(x->val.array))
  2855. return verb_enlist(state, NULL, verb_count(state, NULL, x));
  2856. if (!x->val.array->next)
  2857. return verb_enlist(state, NULL,
  2858. verb_shape(state, NULL, x->val.array->value));
  2859. return verb_enpair(state, NULL, verb_count(state, NULL, x),
  2860. verb_count(state, NULL, x->val.array->value));
  2861. }
  2862. value_t *verb_reshape(interpreter_t *state, verb_t *self, value_t *x,
  2863. value_t *y) {
  2864. if (y->tag != ARRAY)
  2865. y = verb_enlist(state, NULL, y);
  2866. else if (list_empty(y->val.array))
  2867. return y;
  2868. if (x->tag != ARRAY)
  2869. x = verb_enlist(state, NULL, x);
  2870. else if (list_empty(x->val.array))
  2871. return state->unit;
  2872. list_t *r;
  2873. if (!x->val.array->next) {
  2874. value_t *a = x->val.array->value;
  2875. if (a->tag != NUMBER)
  2876. return state->udf;
  2877. size_t k = fabs(a->val.number);
  2878. list_t *t = list_new();
  2879. flatten(y, t);
  2880. r = list_new();
  2881. while (k) {
  2882. list_push(r, t->value);
  2883. if (t->next)
  2884. t = t->next;
  2885. k--;
  2886. }
  2887. } else if (x->val.array->next) {
  2888. value_t *a = x->val.array->value;
  2889. if (a->tag != NUMBER)
  2890. return state->udf;
  2891. value_t *b = x->val.array->next->value;
  2892. if (a->tag != NUMBER)
  2893. return state->udf;
  2894. size_t k = fabs(a->val.number);
  2895. size_t l = fabs(b->val.number);
  2896. y = verb_reshape(state, self, verb_enlist(state, NULL, value_new_number(k * l)), y);
  2897. list_t *t = y->val.array;
  2898. r = list_new();
  2899. while (k--) {
  2900. list_t *rw = list_new();
  2901. for (size_t i = 0; i < l; i++) {
  2902. list_push(rw, t->value);
  2903. t = t->next;
  2904. }
  2905. list_push(r, value_new_array(rw));
  2906. }
  2907. } else
  2908. return state->udf;
  2909. return value_new_array(r);
  2910. }
  2911. value_t *verb_repr(interpreter_t *state, verb_t *self, value_t *x) {
  2912. char *s = value_show(x);
  2913. list_t *r = list_new();
  2914. for (size_t i = 0; i < strlen(s); i++)
  2915. list_push(r, value_new_char(s[i]));
  2916. GC_FREE(s);
  2917. return value_new_array(r);
  2918. }
  2919. char *format(char *template, list_t *replaces) {
  2920. buffer_t *text = buffer_new();
  2921. bool skip = false;
  2922. size_t ri = 0;
  2923. size_t tl = strlen(template);
  2924. size_t rl = list_length(replaces);
  2925. for (size_t i = 0; i < tl; i++) {
  2926. char c = template[i];
  2927. if (skip) {
  2928. buffer_append(text, c);
  2929. skip = false;
  2930. continue;
  2931. }
  2932. if (c == '_') {
  2933. char *s = value_show(list_index(replaces, ri));
  2934. buffer_append_str(text, s);
  2935. GC_FREE(s);
  2936. if (ri < rl - 1)
  2937. ri++;
  2938. continue;
  2939. } else if (c == '{') {
  2940. size_t bi = i;
  2941. buffer_t *n = buffer_new();
  2942. i++;
  2943. while (i < tl && template[i] != '}')
  2944. buffer_append(n, template[i++]);
  2945. if (i >= tl || template[i] != '}') {
  2946. GC_FREE(buffer_read(n));
  2947. buffer_append(text, '{');
  2948. i = bi;
  2949. continue;
  2950. }
  2951. char *s = buffer_read(n);
  2952. ssize_t ind = atoi(s);
  2953. GC_FREE(s);
  2954. value_t *v = list_index(replaces, ind);
  2955. if (!v)
  2956. continue;
  2957. s = value_show(v);
  2958. buffer_append_str(text, s);
  2959. GC_FREE(s);
  2960. continue;
  2961. } else if (c == '~') {
  2962. skip = true;
  2963. continue;
  2964. }
  2965. buffer_append(text, c);
  2966. }
  2967. return buffer_read(text);
  2968. }
  2969. value_t *verb_format(interpreter_t *state, verb_t *self, value_t *x,
  2970. value_t *y) {
  2971. if (y->tag != ARRAY)
  2972. y = verb_enlist(state, NULL, x);
  2973. else if (list_empty(y->val.array))
  2974. return y;
  2975. char *fmt = value_show(x);
  2976. char *s = format(fmt, y->val.array);
  2977. GC_FREE(fmt);
  2978. list_t *r = list_new();
  2979. while (*s)
  2980. list_push(r, value_new_char(*s++));
  2981. return value_new_array(r);
  2982. }
  2983. value_t *verb_insert(interpreter_t *state, verb_t *self, value_t *x,
  2984. value_t *y) {
  2985. if (y->tag != ARRAY)
  2986. y = verb_enlist(state, NULL, y);
  2987. list_t *r = list_new();
  2988. list_t *t = y->val.array;
  2989. while (t) {
  2990. list_push(r, t->value);
  2991. if (t->next)
  2992. list_push(r, x);
  2993. t = t->next;
  2994. }
  2995. return value_new_array(r);
  2996. }
  2997. uint64_t fibonacci(uint64_t n) {
  2998. uint64_t a = 0;
  2999. uint64_t b = 1;
  3000. while (n-- > 1) {
  3001. uint64_t t = a;
  3002. a = b;
  3003. b += t;
  3004. }
  3005. return b;
  3006. }
  3007. value_t *verb_fibonacci(interpreter_t *state, verb_t *self, value_t *x) {
  3008. if (x->tag == NUMBER)
  3009. return value_new_number(fibonacci((uint64_t)fabs(x->val.number)));
  3010. return _NAN;
  3011. }
  3012. value_t *verb_iota(interpreter_t *state, verb_t *self, value_t *x) {
  3013. if (value_equals(x, NUMS[1]))
  3014. return verb_enlist(state, NULL, NUMS[1]);
  3015. else if (value_equals(x, NUMS[0]))
  3016. return state->unit;
  3017. return verb_range(state, self, NUMS[1], x);
  3018. }
  3019. value_t *verb_range(interpreter_t *state, verb_t *self, value_t *x,
  3020. value_t *y) {
  3021. if ((x->tag == NUMBER || x->tag == CHAR) &&
  3022. (y->tag == NUMBER || y->tag == CHAR)) {
  3023. if (x->tag == NUMBER && is_bad_num(x->val.number))
  3024. return state->udf;
  3025. if (y->tag == NUMBER && is_bad_num(y->val.number))
  3026. return state->udf;
  3027. ssize_t s = get_numeric(x);
  3028. ssize_t e = get_numeric(y);
  3029. if (s == e)
  3030. return verb_enlist(state, NULL, x);
  3031. list_t *r = list_new();
  3032. if (s > e)
  3033. for (ssize_t i = s; i >= e; i--) {
  3034. if (x->tag == CHAR || y->tag == CHAR)
  3035. list_push(r, value_new_char(i));
  3036. else
  3037. list_push(r, value_new_number(i));
  3038. }
  3039. else
  3040. for (ssize_t i = s; i <= e; i++) {
  3041. if (x->tag == CHAR || y->tag == CHAR)
  3042. list_push(r, value_new_char(i));
  3043. else
  3044. list_push(r, value_new_number(i));
  3045. }
  3046. return value_new_array(r);
  3047. }
  3048. return _NAN;
  3049. }
  3050. value_t *verb_deal(interpreter_t *state, verb_t *self, value_t *x) {
  3051. if (x->tag != ARRAY)
  3052. return x;
  3053. list_t *t = x->val.array;
  3054. if (list_empty(t))
  3055. return state->udf;
  3056. size_t i = rand() % list_length(t);
  3057. return list_index(t, i);
  3058. }
  3059. value_t *verb_roll(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3060. if (x->tag == NUMBER && y->tag == NUMBER) {
  3061. list_t *r = list_new();
  3062. size_t k = fabs(x->val.number);
  3063. size_t d = fabs(y->val.number);
  3064. for (size_t i = 0; i < k; i++)
  3065. list_push(r, value_new_number(rand() % d));
  3066. return value_new_array(r);
  3067. }
  3068. return state->udf;
  3069. }
  3070. value_t *verb_type(interpreter_t *state, verb_t *self, value_t *x) {
  3071. return NUMS[x->tag];
  3072. }
  3073. value_t *verb_cast(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3074. if (x->tag == NUMBER) {
  3075. int t = fabs(x->val.number);
  3076. if (y->tag == t)
  3077. return y;
  3078. switch (t) {
  3079. case ARRAY:
  3080. if (y->tag == SYMBOL) {
  3081. char *s = y->val.symbol;
  3082. list_t *r = list_new();
  3083. while (*s)
  3084. list_push(r, value_new_char(*s++));
  3085. return value_new_array(r);
  3086. }
  3087. break;
  3088. case NUMBER:
  3089. if (y->tag == CHAR)
  3090. return value_new_number(y->val._char);
  3091. else if (y->tag == ARRAY && is_char_array(y->val.array)) {
  3092. buffer_t *buf = buffer_new();
  3093. list_t *t = y->val.array;
  3094. while (t) {
  3095. buffer_append(buf, ((value_t *)t->value)->val._char);
  3096. t = t->next;
  3097. }
  3098. char *s = buffer_read(buf);
  3099. double r = strtod(s, NULL);
  3100. GC_FREE(s);
  3101. return value_new_number(r);
  3102. }
  3103. break;
  3104. case CHAR:
  3105. if (y->tag == NUMBER)
  3106. return value_new_char(y->val.number);
  3107. break;
  3108. }
  3109. }
  3110. return state->udf;
  3111. }
  3112. value_t *verb_print(interpreter_t *state, verb_t *self, value_t *x) {
  3113. char *s = value_show(x);
  3114. fprintf(stdout, "%s", s);
  3115. GC_FREE(s);
  3116. return state->nil;
  3117. }
  3118. value_t *verb_println(interpreter_t *state, verb_t *self, value_t *x) {
  3119. char *s = value_show(x);
  3120. fprintf(stdout, "%s\n", s);
  3121. GC_FREE(s);
  3122. return state->nil;
  3123. }
  3124. value_t *verb_exit(interpreter_t *state, verb_t *self, value_t *x) {
  3125. if (x->tag != NUMBER)
  3126. return state->udf;
  3127. int code = x->val.number;
  3128. exit(code);
  3129. return state->nil;
  3130. }
  3131. value_t *verb_read(interpreter_t *state, verb_t *self, value_t *x) {
  3132. if (x == NUMS[0]) {
  3133. buffer_t *buf = buffer_new();
  3134. size_t size = 0;
  3135. for (;;) {
  3136. int c = fgetc(stdin);
  3137. if (c < 0)
  3138. break;
  3139. buffer_append(buf, c); size++;
  3140. }
  3141. char *s = buffer_read(buf);
  3142. list_t *r = list_new();
  3143. for (size_t i = 0; i < size; i++)
  3144. list_push(r, value_new_char(s[i]));
  3145. GC_FREE(s);
  3146. return value_new_array(r);
  3147. }
  3148. else if (x == NUMS[1]) {
  3149. char line[512];
  3150. if (!fgets(line, sizeof(line), stdin))
  3151. return state->udf;
  3152. list_t *r = list_new();
  3153. for (size_t i = 0; i < strlen(line); i++)
  3154. list_push(r, value_new_char(line[i]));
  3155. return value_new_array(r);
  3156. }
  3157. char *path = value_show(x);
  3158. FILE *fd = fopen(path, "rb");
  3159. if (!fd) {
  3160. GC_FREE(path);
  3161. return state->udf;
  3162. }
  3163. fseek(fd, 0, SEEK_END);
  3164. size_t size = ftell(fd);
  3165. fseek(fd, 0, SEEK_SET);
  3166. unsigned char *buf = malloc_checked(size + 1);
  3167. if (!buf)
  3168. return state->udf;
  3169. size = fread(buf, sizeof(unsigned char), size, fd);
  3170. fclose(fd);
  3171. GC_FREE(path);
  3172. list_t *r = list_new();
  3173. for (size_t i = 0; i < size; i++)
  3174. list_push(r, value_new_char(buf[i]));
  3175. GC_FREE(buf);
  3176. return value_new_array(r);
  3177. }
  3178. value_t *verb_write(interpreter_t *state, verb_t *self, value_t *x,
  3179. value_t *y) {
  3180. FILE *fd;
  3181. char *path = NULL;
  3182. if (x->tag != ARRAY)
  3183. x = verb_enlist(state, NULL, x);
  3184. if (y == NUMS[0])
  3185. fd = stderr;
  3186. else {
  3187. path = value_show(y);
  3188. fd = fopen(path, "wb");
  3189. if (!fd) {
  3190. GC_FREE(path);
  3191. return NNUMS[0];
  3192. }
  3193. }
  3194. size_t k = 0;
  3195. list_t *t = x->val.array;
  3196. while (t) {
  3197. unsigned char c;
  3198. value_t *v = t->value;
  3199. if (v->tag == NUMBER)
  3200. c = fabs(v->val.number);
  3201. else if (v->tag == CHAR)
  3202. c = v->val._char;
  3203. else break;
  3204. fputc(c, fd);
  3205. t = t->next; k++;
  3206. }
  3207. fclose(fd);
  3208. if (path) GC_FREE(path);
  3209. return value_new_number(k);
  3210. }
  3211. value_t *verb_system(interpreter_t *state, verb_t *self, value_t *x) {
  3212. char *cmd = value_show(x);
  3213. FILE *pd;
  3214. pd = popen(cmd, "r");
  3215. if (!pd) {
  3216. GC_FREE(cmd);
  3217. return state->udf;
  3218. }
  3219. unsigned char *buffer = NULL;
  3220. size_t buffer_size = 0;
  3221. size_t buffer_allocated = 0;
  3222. size_t bytes_received;
  3223. unsigned char chunk[1024];
  3224. for (;;) {
  3225. bytes_received = fread(chunk, 1, 1024, pd);
  3226. if (bytes_received == 0)
  3227. break;
  3228. size_t head = buffer_size;
  3229. buffer_size += bytes_received;
  3230. if (buffer_size > buffer_allocated) {
  3231. buffer_allocated = buffer_size;
  3232. if (!buffer)
  3233. buffer = malloc_checked(buffer_allocated);
  3234. else
  3235. buffer = realloc_checked(buffer, buffer_allocated);
  3236. if (!buffer){
  3237. GC_FREE(cmd);
  3238. pclose(pd);
  3239. return state->udf;
  3240. }
  3241. }
  3242. for (size_t i = 0; i < bytes_received; i++)
  3243. buffer[head + i] = chunk[i];
  3244. if (feof(pd)) break;
  3245. }
  3246. pclose(pd);
  3247. GC_FREE(cmd);
  3248. list_t *r = list_new();
  3249. for (size_t i = 0; i < buffer_size; i++)
  3250. list_push(r, value_new_char(buffer[i]));
  3251. GC_FREE(buffer);
  3252. return value_new_array(r);
  3253. }
  3254. struct files_t {
  3255. FILE *in;
  3256. FILE *out;
  3257. };
  3258. typedef struct files_t files_t;
  3259. struct files_chain_t {
  3260. files_t files;
  3261. pid_t pid;
  3262. struct files_chain_t *next;
  3263. };
  3264. typedef struct files_chain_t files_chain_t;
  3265. static files_chain_t *files_chain;
  3266. void _cleanup_pipe(int *pipe) {
  3267. close(pipe[0]);
  3268. close(pipe[1]);
  3269. }
  3270. static int _do_popen2(files_chain_t *link, const char *command) {
  3271. int child_in[2];
  3272. int child_out[2];
  3273. if (0 != pipe(child_in))
  3274. return -1;
  3275. if (0 != pipe(child_out)) {
  3276. _cleanup_pipe(child_in);
  3277. return -1;
  3278. }
  3279. pid_t cpid = link->pid = fork();
  3280. if (0 > cpid) {
  3281. _cleanup_pipe(child_in);
  3282. _cleanup_pipe(child_out);
  3283. return -1;
  3284. }
  3285. if (0 == cpid) {
  3286. if (0 > dup2(child_in[0], 0) || 0 > dup2(child_out[1], 1))
  3287. _Exit(127);
  3288. _cleanup_pipe(child_in);
  3289. _cleanup_pipe(child_out);
  3290. for (files_chain_t *p = files_chain; p; p = p->next) {
  3291. int fd_in = fileno(p->files.in);
  3292. if (fd_in != 0)
  3293. close(fd_in);
  3294. int fd_out = fileno(p->files.out);
  3295. if (fd_out != 1)
  3296. close(fd_out);
  3297. }
  3298. execl("/bin/sh", "sh", "-c", command, (char *)NULL);
  3299. _Exit(127);
  3300. }
  3301. close(child_in[0]);
  3302. close(child_out[1]);
  3303. link->files.in = fdopen(child_in[1], "w");
  3304. link->files.out = fdopen(child_out[0], "r");
  3305. return 0;
  3306. }
  3307. files_t *popen2(const char *command) {
  3308. files_chain_t *link = (files_chain_t *) malloc(sizeof (files_chain_t));
  3309. if (NULL == link)
  3310. return NULL;
  3311. if (0 > _do_popen2(link, command)) {
  3312. free(link);
  3313. return NULL;
  3314. }
  3315. link->next = files_chain;
  3316. files_chain = link;
  3317. return (files_t *) link;
  3318. }
  3319. int pclose2(files_t *fp) {
  3320. files_chain_t **p = &files_chain;
  3321. int found = 0;
  3322. while (*p) {
  3323. if (*p == (files_chain_t *) fp) {
  3324. *p = (*p)->next;
  3325. found = 1;
  3326. break;
  3327. }
  3328. p = &(*p)->next;
  3329. }
  3330. if (!found)
  3331. return -1;
  3332. if (0 > fclose(fp->out)) {
  3333. free((files_chain_t *) fp);
  3334. return -1;
  3335. }
  3336. int status = -1;
  3337. pid_t wait_pid;
  3338. do {
  3339. wait_pid = waitpid(((files_chain_t *) fp)->pid, &status, 0);
  3340. } while (-1 == wait_pid && EINTR == errno);
  3341. free((files_chain_t *) fp);
  3342. if (wait_pid == -1)
  3343. return -1;
  3344. return status;
  3345. }
  3346. value_t *verb_system2(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3347. char *cmd = value_show(y);
  3348. files_t *pd;
  3349. pd = popen2(cmd);
  3350. if (pd == NULL) {
  3351. GC_FREE(cmd);
  3352. return state->udf;
  3353. }
  3354. list_t *t = x->val.array;
  3355. while (t) {
  3356. unsigned char c;
  3357. value_t *v = t->value;
  3358. if (v->tag == NUMBER)
  3359. c = fabs(v->val.number);
  3360. else if (v->tag == CHAR)
  3361. c = v->val._char;
  3362. else break;
  3363. fputc(c, pd->in);
  3364. t = t->next;
  3365. }
  3366. fflush(pd->in);
  3367. fclose(pd->in);
  3368. unsigned char *buffer = NULL;
  3369. size_t buffer_size = 0;
  3370. size_t buffer_allocated = 0;
  3371. size_t bytes_received;
  3372. unsigned char chunk[1024];
  3373. for (;;) {
  3374. bytes_received = fread(chunk, 1, 1024, pd->out);
  3375. if (bytes_received == 0)
  3376. break;
  3377. size_t head = buffer_size;
  3378. buffer_size += bytes_received;
  3379. if (buffer_size > buffer_allocated) {
  3380. buffer_allocated = buffer_size;
  3381. if (!buffer)
  3382. buffer = malloc_checked(buffer_allocated);
  3383. else
  3384. buffer = realloc_checked(buffer, buffer_allocated);
  3385. if (!buffer){
  3386. GC_FREE(cmd);
  3387. pclose2(pd);
  3388. return state->udf;
  3389. }
  3390. }
  3391. for (size_t i = 0; i < bytes_received; i++)
  3392. buffer[head + i] = chunk[i];
  3393. if (feof(pd->out)) break;
  3394. }
  3395. pclose2(pd);
  3396. GC_FREE(cmd);
  3397. list_t *r = list_new();
  3398. for (size_t i = 0; i < buffer_size; i++)
  3399. list_push(r, value_new_char(buffer[i]));
  3400. GC_FREE(buffer);
  3401. return value_new_array(r);
  3402. }
  3403. value_t *verb_shl(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3404. if (x->tag == NUMBER && y->tag == NUMBER)
  3405. return value_new_number(((int)x->val.number) << ((int)y->val.number));
  3406. return _NAN;
  3407. }
  3408. value_t *verb_shr(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3409. if (x->tag == NUMBER && y->tag == NUMBER)
  3410. return value_new_number(((int)x->val.number) >> ((int)y->val.number));
  3411. return _NAN;
  3412. }
  3413. value_t *verb_xor(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3414. if (x->tag == NUMBER && y->tag == NUMBER)
  3415. return value_new_number(((int)x->val.number) ^ ((int)y->val.number));
  3416. return _NAN;
  3417. }
  3418. value_t *verb_band(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3419. if (x->tag == NUMBER && y->tag == NUMBER)
  3420. return value_new_number(((int)x->val.number) & ((int)y->val.number));
  3421. return _NAN;
  3422. }
  3423. list_t *find_primes(uint64_t limit) {
  3424. bool sieve[limit + 1];
  3425. for (uint64_t i = 0; i <= limit; i++)
  3426. sieve[i] = false;
  3427. if (limit > 2)
  3428. sieve[2] = true;
  3429. if (limit > 3)
  3430. sieve[3] = true;
  3431. for (uint64_t x = 1; x * x <= limit; x++)
  3432. for (uint64_t y = 1; y * y <= limit; y++) {
  3433. uint64_t n = (4 * x * x) + (y * y);
  3434. if (n <= limit && (n % 12 == 1 || n % 12 == 5))
  3435. sieve[n] ^= true;
  3436. n = (3 * x * x) + (y * y);
  3437. if (n <= limit && n % 12 == 7)
  3438. sieve[n] ^= true;
  3439. n = (3 * x * x) - (y * y);
  3440. if (x > y && n <= limit && n % 12 == 11)
  3441. sieve[n] ^= true;
  3442. }
  3443. for (uint64_t r = 5; r * r <= limit; r++)
  3444. if (sieve[r])
  3445. for (int i = r * r; i <= limit; i += r * r)
  3446. sieve[i] = false;
  3447. list_t *r = list_new();
  3448. for (uint64_t a = 1; a <= limit; a++)
  3449. if (sieve[a])
  3450. list_push(r, value_new_number(a));
  3451. return r;
  3452. }
  3453. value_t *verb_primes(interpreter_t *state, verb_t *self, value_t *x) {
  3454. if (x->tag == NUMBER && !is_bad_num(x->val.number))
  3455. return value_new_array(find_primes(fabs(x->val.number) + 1));
  3456. return state->udf;
  3457. }
  3458. value_t *verb_parts(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3459. if (x->tag != NUMBER)
  3460. return state->udf;
  3461. if (y->tag != ARRAY)
  3462. y = verb_enlist(state, NULL, y);
  3463. else if (list_empty(y->val.array))
  3464. return y;
  3465. list_t *r = list_new();
  3466. size_t l = list_length(y->val.array);
  3467. size_t k = fabs(x->val.number);
  3468. while (y->tag == ARRAY && !list_empty(y->val.array)) {
  3469. list_push(r, verb_take(state, NULL, value_new_number(k), y));
  3470. y = verb_drop(state, NULL, value_new_number(k), y);
  3471. }
  3472. return value_new_array(r);
  3473. }
  3474. value_t *verb_bor(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3475. if (x->tag == NUMBER && y->tag == NUMBER)
  3476. return value_new_number(((int)x->val.number) | ((int)y->val.number));
  3477. return _NAN;
  3478. }
  3479. value_t *verb_bnot(interpreter_t *state, verb_t *self, value_t *x) {
  3480. if (x->tag == NUMBER)
  3481. return value_new_number(~(int)x->val.number);
  3482. return _NAN;
  3483. }
  3484. list_t *prime_factors(double n) {
  3485. list_t *factors = list_new();
  3486. double divisor = 2;
  3487. while (n >= 2) {
  3488. if (fmod(n, divisor) == 0) {
  3489. list_push(factors, value_new_number(divisor));
  3490. n /= divisor;
  3491. } else divisor++;
  3492. }
  3493. return factors;
  3494. }
  3495. value_t *verb_factors(interpreter_t *state, verb_t *self, value_t *x) {
  3496. if (x->tag == NUMBER && !is_bad_num(x->val.number))
  3497. return value_new_array(prime_factors(x->val.number));
  3498. return state->udf;
  3499. }
  3500. value_t *verb_combine(interpreter_t *state, verb_t *self, value_t *x,
  3501. value_t *y) {
  3502. if (x->tag == NUMBER && y->tag == NUMBER && !is_bad_num(x->val.number) && !is_bad_num(y->val.number)) {
  3503. value_t *n = verb_enpair(state, NULL, x, y);
  3504. return verb_unbase(state, NULL, NUMS[10], n);
  3505. }
  3506. return _NAN;
  3507. }
  3508. value_t *verb_outof(interpreter_t *state, verb_t *self, value_t *x,
  3509. value_t *y) {
  3510. if (x->tag == NUMBER && y->tag == NUMBER && !is_bad_num(x->val.number) && !is_bad_num(y->val.number) && x->val.number > 0 && y->val.number > 0) {
  3511. uint64_t a = (uint64_t)fabs(x->val.number);
  3512. uint64_t b = (uint64_t)fabs(y->val.number);
  3513. return value_new_number(factorial(b) / (factorial(a) * (a >= b? 1: factorial(b - a))));
  3514. }
  3515. return _NAN;
  3516. }
  3517. value_t *verb_sort(interpreter_t *state, verb_t *self, value_t *x) {
  3518. value_t *i = verb_gradeup(state, NULL, x);
  3519. return together(state, state->at, x, i, 0, 0, state->at->rank[1], state->at->rank[2]);
  3520. }
  3521. value_t *verb_unsort(interpreter_t *state, verb_t *self, value_t *x) {
  3522. value_t *i = verb_gradedown(state, NULL, x);
  3523. return together(state, state->at, x, i, 0, 0, state->at->rank[1], state->at->rank[2]);
  3524. }
  3525. value_t *interpreter_run(interpreter_t *state, char *program);
  3526. value_t *verb_eval(interpreter_t *state, verb_t *self, value_t *x) {
  3527. char *s = value_show(x);
  3528. jmp_buf *lb = guard();
  3529. if (setjmp(*lb)) {
  3530. unguard();
  3531. GC_FREE(s);
  3532. return state->udf;
  3533. }
  3534. value_t *v = interpreter_run(state, s);
  3535. GC_FREE(s);
  3536. unguard();
  3537. return v;
  3538. }
  3539. value_t *verb_import(interpreter_t *state, verb_t *self, value_t *x) {
  3540. char *path = value_show(x);
  3541. FILE *fd = fopen(path, "rb");
  3542. if (!fd) {
  3543. GC_FREE(path);
  3544. return state->udf;
  3545. }
  3546. fseek(fd, 0, SEEK_END);
  3547. size_t size = ftell(fd);
  3548. fseek(fd, 0, SEEK_SET);
  3549. unsigned char *buf = malloc_checked(size + 1);
  3550. if (!buf)
  3551. return state->udf;
  3552. size = fread(buf, sizeof(unsigned char), size, fd);
  3553. fclose(fd);
  3554. GC_FREE(path);
  3555. value_t *v = interpreter_run(state, (char *)buf);
  3556. GC_FREE(buf);
  3557. return v;
  3558. }
  3559. value_t *verb_explode(interpreter_t *state, verb_t *self, value_t *x,
  3560. value_t *y) {
  3561. char *del = value_show(x);
  3562. char *s = value_show(y);
  3563. size_t dell = strlen(del);
  3564. size_t sl = strlen(s);
  3565. list_t *r = list_new();
  3566. list_t *t = list_new();
  3567. for (size_t i = 0; i < sl; i++) {
  3568. if (strncmp(&s[i], del, dell) == 0) {
  3569. list_push(r, value_new_array(t));
  3570. t = list_new();
  3571. i += dell-1; continue;
  3572. }
  3573. list_push(t, CHARS[s[i]]);
  3574. }
  3575. GC_FREE(s);
  3576. GC_FREE(del);
  3577. list_push(r, value_new_array(t));
  3578. return value_new_array(r);
  3579. }
  3580. value_t *verb_implode(interpreter_t *state, verb_t *self, value_t *x,
  3581. value_t *y) {
  3582. if (y->tag != ARRAY || list_empty(y->val.array))
  3583. return y;
  3584. char *del = value_show(x);
  3585. list_t *r = list_new();
  3586. list_t *t = y->val.array;
  3587. while (t) {
  3588. char *s = value_show(t->value);
  3589. char *_s = s;
  3590. while (*_s)
  3591. list_push(r, CHARS[*_s++]);
  3592. GC_FREE(s);
  3593. if (t->next) {
  3594. char *s = del;
  3595. while (*s)
  3596. list_push(r, CHARS[*s++]);
  3597. }
  3598. t = t->next;
  3599. }
  3600. GC_FREE(del);
  3601. return value_new_array(r);
  3602. }
  3603. value_t *verb_eye(interpreter_t *state, verb_t *self, value_t *x) {
  3604. if (x->tag == NUMBER && !is_bad_num(x->val.number)) {
  3605. size_t k = fabs(x->val.number);
  3606. list_t *r = list_new();
  3607. for (size_t i = 0; i < k; i++) {
  3608. list_t *rw = list_new();
  3609. for (size_t j = 0; j < k; j++)
  3610. list_push(rw, NUMS[i == j]);
  3611. list_push(r, value_new_array(rw));
  3612. }
  3613. return value_new_array(r);
  3614. }
  3615. return state->udf;
  3616. }
  3617. value_t *verb_udf1(interpreter_t *state, verb_t *self, value_t *x) {
  3618. return state->udf;
  3619. }
  3620. value_t *verb_udf2(interpreter_t *state, verb_t *self, value_t *x, value_t *y) {
  3621. return state->udf;
  3622. }
  3623. #define X UINT_MAX
  3624. #define DEFVERB(__symb, __rm, __rl, __rr, __monad, __dyad) \
  3625. {__symb, {__rm, __rl, __rr}, NULL, false, false, verb_##__monad, verb_##__dyad}
  3626. #define DEFVERBD(__symb, __rm, __rl, __rr, __monad, __dyad) \
  3627. {__symb ".", {__rm, __rl, __rr}, NULL, false, false, verb_##__monad, verb_##__dyad}
  3628. #define DEFVERBC(__symb, __rm, __rl, __rr, __monad, __dyad) \
  3629. {__symb ":", {__rm, __rl, __rr}, NULL, false, false, verb_##__monad, verb_##__dyad}
  3630. verb_t VERBS[] = {
  3631. DEFVERB(":", 0, 0, 0, const, bind),
  3632. DEFVERBC(":", 0, 0, 0, udf1, obverse),
  3633. DEFVERB("+", 0, X, X, flip, plus),
  3634. DEFVERBD("+", X, X, X, fibonacci, gcd),
  3635. DEFVERBC("+", X, X, X, sin, combine),
  3636. DEFVERB("-", X, X, X, negate, minus),
  3637. DEFVERBD("-", X, X, X, atan, atan2),
  3638. DEFVERB("*", 0, X, X, first, times),
  3639. DEFVERBD("*", X, X, X, factorial, lcm),
  3640. DEFVERBC("*", X, X, 0, double, replicate),
  3641. DEFVERB("%", X, X, X, reciprocal, divide),
  3642. DEFVERBD("%", X, X, X, sqrt, root),
  3643. DEFVERBC("%", X, X, X, halve, idivide),
  3644. DEFVERB("!", X, X, X, enum, mod),
  3645. DEFVERBD("!", X, X, X, iota, range),
  3646. DEFVERBC("!", 0, X, 0, odometer, chunks),
  3647. DEFVERB("^", X, X, X, exp, power),
  3648. DEFVERBD("^", X, X, X, nlog, log),
  3649. DEFVERB("=", 0, X, X, permute, equals),
  3650. DEFVERBD("=", 0, 0, 0, occurences, mask),
  3651. DEFVERBC("=", 0, 0, 0, classify, equals),
  3652. DEFVERB("~", X, X, X, not, not_equals),
  3653. DEFVERBD("~", X, 0, 0, sign, insert),
  3654. DEFVERBC("~", 0, 0, 0, not, not_equals),
  3655. DEFVERB("<", X, X, X, pred, less),
  3656. DEFVERBD("<", X, X, X, floor, lesseq),
  3657. DEFVERBC("<", 0, X, 0, gradedown, nudge_left),
  3658. DEFVERB(">", X, X, X, succ, greater),
  3659. DEFVERBD(">", X, X, X, ceil, greatereq),
  3660. DEFVERBC(">", 0, X, 0, gradeup, nudge_right),
  3661. DEFVERB(",", 0, 0, 0, enlist, join),
  3662. DEFVERBD(",", X, 0, 0, enlist, enpair),
  3663. DEFVERB("#", 0, X, 0, count, take),
  3664. DEFVERBD("#", 0, 0, 0, where, copy),
  3665. DEFVERBC("#", 0, 0, 0, group, buckets),
  3666. DEFVERB("_", 0, X, 0, nub, drop),
  3667. DEFVERBD("_", 0, X, 0, unbits, unbase),
  3668. DEFVERBC("_", X, X, X, bits, base),
  3669. DEFVERB("?", 0, 0, 0, unique, find),
  3670. DEFVERB("&", 0, X, X, flatten, minand),
  3671. DEFVERB("|", 0, X, X, reverse, maxor),
  3672. DEFVERBD("|", X, X, 0, round, rotate),
  3673. DEFVERBC("|", 0, X, 0, depth, windows),
  3674. DEFVERB("@", X, 0, X, abs, at),
  3675. DEFVERBD("@", 0, 0, 0, shuffle, member),
  3676. DEFVERB("{", 0, 0, 0, head, bin),
  3677. DEFVERBD("{", 0, 0, 0, tail, cut),
  3678. DEFVERBC("{", 0, X, X, prefixes, shl),
  3679. DEFVERB("}", 0, X, X, behead, xor),
  3680. DEFVERBD("}", 0, 0, 0, curtail, band),
  3681. DEFVERBC("}", 0, X, X, suffixes, shr),
  3682. DEFVERB("[", X, 0, 0, factors, left),
  3683. DEFVERBD("[", X, X, X, bnot, bor),
  3684. DEFVERBC("[", X, X, 0, primes, parts),
  3685. DEFVERB("]", 0, 0, 0, same, right),
  3686. DEFVERBD("]", 0, X, X, sort, outof),
  3687. DEFVERBC("]", 0, 0, 0, unsort, explode),
  3688. DEFVERBD("`", 0, 0, 0, symbol, apply1),
  3689. DEFVERBC("`", 0, 0, 0, square, apply2),
  3690. DEFVERB("$", 0, 0, 0, shape, reshape),
  3691. DEFVERBD("$", 0, 0, 0, repr, format),
  3692. DEFVERBC("$", X, 0, 0, eye, implode),
  3693. DEFVERBD("p", 0, 0, 0, print, udf2),
  3694. DEFVERBD("P", 0, 0, 0, println, udf2),
  3695. DEFVERBD("f", 0, 0, 0, selfref1, selfref2),
  3696. DEFVERBD("F", 0, 0, 0, read, write),
  3697. DEFVERBD("r", 0, X, X, deal, roll),
  3698. DEFVERBD("t", 0, 0, 0, type, cast),
  3699. DEFVERBD("E", 0, 0, 0, exit, udf2),
  3700. DEFVERBD("y", 0, 0, 0, system, system2),
  3701. DEFVERBD("e", 0, 0, 0, eval, udf2),
  3702. DEFVERBD("i", 0, 0, 0, import, udf2)
  3703. };
  3704. value_t *_adverb_fold_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3705. if (x->tag != ARRAY || list_empty(x->val.array))
  3706. return x;
  3707. value_t *_v = self->bonds->value;
  3708. if (_v->tag != VERB)
  3709. return state->udf;
  3710. verb_t *v = _v->val.verb;
  3711. value_t *t = x->val.array->value;
  3712. list_t *tx = x->val.array->next;
  3713. while (tx) {
  3714. t = together(state, v, t, tx->value, 0, 0, v->rank[1], v->rank[2]);
  3715. tx = tx->next;
  3716. }
  3717. return t;
  3718. }
  3719. value_t *_adverb_fold_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3720. value_t *y) {
  3721. if (y->tag != ARRAY || list_empty(y->val.array))
  3722. return y;
  3723. value_t *_v = self->bonds->value;
  3724. if (_v->tag != VERB)
  3725. return state->udf;
  3726. verb_t *v = _v->val.verb;
  3727. value_t *t = x;
  3728. list_t *ty = y->val.array;
  3729. while (ty) {
  3730. t = together(state, v, t, ty->value, 0, 0, v->rank[1], v->rank[2]);
  3731. ty = ty->next;
  3732. }
  3733. return t;
  3734. }
  3735. value_t *_adverb_scan_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3736. if (x->tag != ARRAY || list_empty(x->val.array))
  3737. return x;
  3738. value_t *_v = self->bonds->value;
  3739. if (_v->tag != VERB)
  3740. return state->udf;
  3741. verb_t *v = _v->val.verb;
  3742. list_t *r = list_new();
  3743. value_t *t = x->val.array->value;
  3744. list_t *tx = x->val.array->next;
  3745. list_push(r, t);
  3746. while (tx) {
  3747. t = together(state, v, t, tx->value, 0, 0, v->rank[1], v->rank[2]);
  3748. list_push(r, t);
  3749. tx = tx->next;
  3750. }
  3751. return value_new_array(r);
  3752. }
  3753. value_t *_adverb_scan_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3754. value_t *y) {
  3755. if (y->tag != ARRAY || list_empty(y->val.array))
  3756. return y;
  3757. value_t *_v = self->bonds->value;
  3758. if (_v->tag != VERB)
  3759. return state->udf;
  3760. verb_t *v = _v->val.verb;
  3761. list_t *r = list_new();
  3762. value_t *t = x;
  3763. list_t *ty = y->val.array;
  3764. list_push(r, t);
  3765. while (ty) {
  3766. t = together(state, v, t, ty->value, 0, 0, v->rank[1], v->rank[2]);
  3767. list_push(r, t);
  3768. ty = ty->next;
  3769. }
  3770. return value_new_array(r);
  3771. }
  3772. value_t *_adverb_each_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3773. value_t *_v = self->bonds->value;
  3774. if (_v->tag != VERB)
  3775. return state->udf;
  3776. verb_t *v = _v->val.verb;
  3777. if (x->tag != ARRAY)
  3778. return each_rank(state, v, x, 0, 1);
  3779. if (list_empty(x->val.array))
  3780. return x;
  3781. return each_rank(state, v, x, 0, 1);
  3782. }
  3783. value_t *_adverb_each_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3784. value_t *y) {
  3785. value_t *_v = self->bonds->value;
  3786. if (_v->tag != VERB)
  3787. return state->udf;
  3788. verb_t *v = _v->val.verb;
  3789. if (x->tag != ARRAY)
  3790. x = verb_enlist(state, NULL, x);
  3791. if (y->tag != ARRAY)
  3792. y = verb_enlist(state, NULL, y);
  3793. list_t *r = list_new();
  3794. list_t *tx = x->val.array;
  3795. list_t *ty = y->val.array;
  3796. while (tx && ty) {
  3797. list_push(r, together(state, v, tx->value, ty->value, 0, 0, v->rank[1],
  3798. v->rank[2]));
  3799. tx = tx->next;
  3800. ty = ty->next;
  3801. }
  3802. return value_new_array(r);
  3803. }
  3804. value_t *_adverb_converge_monad(interpreter_t *state, verb_t *self,
  3805. value_t *x) {
  3806. value_t *_v = self->bonds->value;
  3807. if (_v->tag != VERB)
  3808. return state->udf;
  3809. verb_t *v = _v->val.verb;
  3810. value_t *t;
  3811. for (;;) {
  3812. t = x;
  3813. x = each_rank(state, v, x, 0, v->rank[0]);
  3814. if (value_equals(x, t))
  3815. break;
  3816. }
  3817. return x;
  3818. }
  3819. verb_t *conjunction_bond(interpreter_t *state, value_t *x, value_t *y);
  3820. value_t *_adverb_converge_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3821. value_t *y) {
  3822. value_t *_v = self->bonds->value;
  3823. if (_v->tag != VERB)
  3824. return state->udf;
  3825. verb_t *v = _v->val.verb;
  3826. if (y->tag != ARRAY)
  3827. return together(state, v, y, x, 0, 0, v->rank[1], v->rank[2]);
  3828. if (list_empty(y->val.array))
  3829. return x;
  3830. v = conjunction_bond(state, value_new_verb(v), x);
  3831. return each_rank(state, v, y, 0, 1);
  3832. }
  3833. value_t *_adverb_converges_monad(interpreter_t *state, verb_t *self,
  3834. value_t *x) {
  3835. value_t *_v = self->bonds->value;
  3836. if (_v->tag != VERB)
  3837. return state->udf;
  3838. list_t *r = list_new();
  3839. value_t *t;
  3840. list_push(r, x);
  3841. for (;;) {
  3842. t = x;
  3843. x = apply_monad(state, _v, x);
  3844. if (value_equals(x, t))
  3845. break;
  3846. list_push(r, x);
  3847. }
  3848. return value_new_array(r);
  3849. }
  3850. value_t *_adverb_converges_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3851. value_t *y) {
  3852. value_t *_v = self->bonds->value;
  3853. if (_v->tag != VERB)
  3854. return state->udf;
  3855. verb_t *v = _v->val.verb;
  3856. if (y->tag != ARRAY)
  3857. return together(state, v, y, x, 0, 0, v->rank[1], v->rank[2]);
  3858. if (list_empty(y->val.array))
  3859. return x;
  3860. v = conjunction_bond(state, x, value_new_verb(v));
  3861. return each_rank(state, v, y, 0, 1);
  3862. }
  3863. value_t *_adverb_eachprior_monad(interpreter_t *state, verb_t *self,
  3864. value_t *x) {
  3865. if (x->tag != ARRAY || list_empty(x->val.array) || !x->val.array->next)
  3866. return x;
  3867. value_t *_v = self->bonds->value;
  3868. if (_v->tag != VERB)
  3869. return state->udf;
  3870. verb_t *v = _v->val.verb;
  3871. list_t *r = list_new();
  3872. list_t *p = x->val.array;
  3873. list_t *t = x->val.array->next;
  3874. while (t) {
  3875. list_push(r, together(state, v, t->value, p->value, 0, 0, v->rank[1],
  3876. v->rank[2]));
  3877. p = t;
  3878. t = t->next;
  3879. }
  3880. return value_new_array(r);
  3881. }
  3882. value_t *_adverb_eachprior_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3883. value_t *y) {
  3884. if (y->tag != ARRAY || list_empty(y->val.array))
  3885. return y;
  3886. value_t *_v = self->bonds->value;
  3887. if (_v->tag != VERB)
  3888. return state->udf;
  3889. verb_t *v = _v->val.verb;
  3890. list_t *r = list_new();
  3891. list_t *p = NULL;
  3892. list_t *t = y->val.array;
  3893. while (t) {
  3894. list_push(r, together(state, v, t->value, !p ? x : p->value, 0, 0,
  3895. v->rank[1], v->rank[2]));
  3896. p = t;
  3897. t = t->next;
  3898. }
  3899. return value_new_array(r);
  3900. }
  3901. value_t *_adverb_reflex_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3902. value_t *_v = self->bonds->value;
  3903. if (_v->tag != VERB)
  3904. return state->udf;
  3905. verb_t *v = _v->val.verb;
  3906. return together(state, v, x, x, 0, 0, v->rank[1], v->rank[2]);
  3907. }
  3908. value_t *_adverb_reflex_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3909. value_t *y) {
  3910. value_t *_v = self->bonds->value;
  3911. if (_v->tag != VERB)
  3912. return state->udf;
  3913. verb_t *v = _v->val.verb;
  3914. return together(state, v, y, x, 0, 0, v->rank[1], v->rank[2]);
  3915. }
  3916. value_t *_adverb_amend_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3917. return state->udf;
  3918. }
  3919. value_t *_adverb_amend_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3920. value_t *y) {
  3921. if (x->tag != ARRAY)
  3922. x = verb_enlist(state, NULL, x);
  3923. value_t *v = self->bonds->value;
  3924. if (v->tag != ARRAY)
  3925. v = verb_enlist(state, NULL, v);
  3926. if (y->tag != ARRAY)
  3927. y = verb_enlist(state, NULL, y);
  3928. list_t *r = list_copy(y->val.array);
  3929. size_t i = 0;
  3930. size_t l = list_length(x->val.array);
  3931. list_t *t = v->val.array;
  3932. while (t) {
  3933. value_t *n = t->value;
  3934. if (n->tag != NUMBER)
  3935. break;
  3936. list_set(r, n->val.number, list_index(x->val.array, i < l ? i : l - 1));
  3937. t = t->next;
  3938. i++;
  3939. }
  3940. return value_new_array(r);
  3941. }
  3942. value_t *_adverb_filter_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3943. value_t *_v = self->bonds->value;
  3944. if (_v->tag != VERB)
  3945. return state->udf;
  3946. if (x->tag != ARRAY)
  3947. x = verb_enlist(state, NULL, x);
  3948. else if (list_empty(x->val.array))
  3949. return x;
  3950. verb_t *v = _v->val.verb;
  3951. list_t *r = list_new();
  3952. list_t *t = x->val.array;
  3953. while (t) {
  3954. value_t *b = each_rank(state, v, t->value, 0, v->rank[0]);
  3955. if (value_is_truthy(b))
  3956. list_push(r, t->value);
  3957. t = t->next;
  3958. }
  3959. return value_new_array(r);
  3960. }
  3961. value_t *_adverb_filter_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3962. value_t *y) {
  3963. return state->udf;
  3964. }
  3965. value_t *_adverb_span_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3966. value_t *v = self->bonds->value;
  3967. if (v->tag != VERB)
  3968. return state->udf;
  3969. if (x->tag != ARRAY)
  3970. x = verb_enlist(state, NULL, x);
  3971. else if (list_empty(x->val.array))
  3972. return x;
  3973. list_t *r = list_new();
  3974. list_t *t = x->val.array;
  3975. list_t *p = list_new();
  3976. while (t) {
  3977. value_t *b = apply_monad(state, v, t->value);
  3978. if (value_is_truthy(b)) {
  3979. list_push(r, value_new_array(p));
  3980. p = list_new();
  3981. } else list_push(p, t->value);
  3982. t = t->next;
  3983. }
  3984. list_push(r, value_new_array(p));
  3985. return value_new_array(r);
  3986. }
  3987. value_t *_adverb_span_dyad(interpreter_t *state, verb_t *self, value_t *x,
  3988. value_t *y) {
  3989. value_t *_v = self->bonds->value;
  3990. if (_v->tag != VERB)
  3991. return state->udf;
  3992. verb_t *v = _v->val.verb;
  3993. value_t *r = verb_windows(state, NULL, x, y);
  3994. return each_rank(state, v, r, 0, 1);
  3995. }
  3996. value_t *_adverb_inverse_monad(interpreter_t *state, verb_t *self, value_t *x) {
  3997. value_t *_v = self->bonds->value;
  3998. if (_v->tag != VERB)
  3999. return state->udf;
  4000. verb_t *v = _v->val.verb;
  4001. verb_t *iv = table_get(Inverses, v->name);
  4002. if (!iv)
  4003. return state->udf;
  4004. return each_rank(state, iv, x, 0, iv->rank[0]);
  4005. }
  4006. value_t *_adverb_inverse_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4007. value_t *y) {
  4008. value_t *_v = self->bonds->value;
  4009. if (_v->tag != VERB)
  4010. return state->udf;
  4011. verb_t *v = _v->val.verb;
  4012. verb_t *iv = table_get(Inverses, v->name);
  4013. if (!iv)
  4014. return state->udf;
  4015. value_t *a = each_rank(state, iv, x, 0, iv->rank[0]);
  4016. value_t *b = each_rank(state, iv, y, 0, iv->rank[0]);
  4017. return apply_dyad(state, _v, a, b);
  4018. }
  4019. #define ADVERB(__name, __symb) \
  4020. verb_t *adverb_##__name(interpreter_t *state, value_t *v) { \
  4021. verb_t *nv = verb_new(); \
  4022. nv->bonds = list_new(); \
  4023. list_push(nv->bonds, v); \
  4024. char *r = value_show(v); \
  4025. size_t l = strlen(r) + strlen(__symb) + 1; \
  4026. nv->name = malloc_checked(l); \
  4027. snprintf(nv->name, l, "%s" __symb, r); \
  4028. GC_FREE(r); \
  4029. nv->rank[0] = 0; \
  4030. nv->monad = _adverb_##__name##_monad; \
  4031. nv->dyad = _adverb_##__name##_dyad; \
  4032. return nv; \
  4033. }
  4034. ADVERB(fold, "/");
  4035. ADVERB(converge, "/.");
  4036. ADVERB(scan, "\\");
  4037. ADVERB(converges, "\\.");
  4038. ADVERB(each, "\"");
  4039. ADVERB(eachprior, "\".");
  4040. ADVERB(reflex, ";.");
  4041. ADVERB(amend, "`");
  4042. ADVERB(filter, "&.");
  4043. ADVERB(span, "/:");
  4044. ADVERB(inverse, "-:");
  4045. adverb_t ADVERBS[] = {
  4046. {"/", adverb_fold, NULL}, {"/.", adverb_converge, NULL},
  4047. {"\\", adverb_scan, NULL}, {"\\.", adverb_converges, NULL},
  4048. {"\"", adverb_each, NULL}, {"\".", adverb_eachprior, NULL},
  4049. {";.", adverb_reflex, NULL}, {"`", adverb_amend, NULL},
  4050. {"&.", adverb_filter, NULL}, {"/:", adverb_span, NULL},
  4051. {"-:", adverb_inverse, NULL}};
  4052. value_t *_conjunction_bond_monad(interpreter_t *state, verb_t *self,
  4053. value_t *x) {
  4054. value_t *v1 = self->bonds->value;
  4055. value_t *v2 = self->bonds->next->value;
  4056. if (v1->tag == VERB && v2->tag == VERB)
  4057. return apply_monad(state, v1, apply_monad(state, v2, x));
  4058. else if (v1->tag == VERB)
  4059. return apply_dyad(state, v1, x, v2);
  4060. else if (v2->tag == VERB)
  4061. return apply_dyad(state, v2, v1, x);
  4062. else
  4063. return state->nil;
  4064. }
  4065. value_t *_conjunction_bond_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4066. value_t *y) {
  4067. value_t *v1 = self->bonds->value;
  4068. value_t *v2 = self->bonds->next->value;
  4069. if (v1->tag == VERB && v2->tag == VERB)
  4070. return apply_monad(state, v1, apply_dyad(state, v2, x, y));
  4071. else if (v1->tag == VERB)
  4072. return apply_dyad(state, v1, apply_dyad(state, v1, x, y), v2);
  4073. else if (v2->tag == VERB)
  4074. return apply_dyad(state, v2, v1, apply_dyad(state, v2, x, y));
  4075. else
  4076. return state->nil;
  4077. }
  4078. value_t *_conjunction_pick_monad(interpreter_t *state, verb_t *self,
  4079. value_t *x) {
  4080. value_t *v1 = self->bonds->value;
  4081. value_t *v2 = self->bonds->next->value;
  4082. if (v1->tag != VERB || v2->tag != ARRAY)
  4083. return state->nil;
  4084. value_t *n = apply_monad(state, v1, x);
  4085. value_t *f = verb_at(state, NULL, v2, n);
  4086. return apply_monad(state, f, x);
  4087. }
  4088. value_t *_conjunction_pick_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4089. value_t *y) {
  4090. value_t *v1 = self->bonds->value;
  4091. value_t *v2 = self->bonds->next->value;
  4092. if (v1->tag != VERB || v2->tag != ARRAY)
  4093. return state->nil;
  4094. value_t *n = apply_dyad(state, v1, x, y);
  4095. value_t *f = verb_at(state, NULL, v2, n);
  4096. return apply_dyad(state, f, x, y);
  4097. }
  4098. value_t *_conjunction_while_monad(interpreter_t *state, verb_t *self,
  4099. value_t *x) {
  4100. value_t *v1 = self->bonds->value;
  4101. value_t *v2 = self->bonds->next->value;
  4102. if (v1->tag == VERB) {
  4103. for (;;) {
  4104. if (!value_is_truthy(apply_monad(state, v1, x)))
  4105. break;
  4106. x = apply_monad(state, v2, x);
  4107. }
  4108. } else if (v1->tag == NUMBER) {
  4109. size_t k = (size_t)fabs(v1->val.number);
  4110. for (size_t i = 0; i < k; i++)
  4111. x = apply_monad(state, v2, x);
  4112. }
  4113. return x;
  4114. }
  4115. value_t *_conjunction_while_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4116. value_t *y) {
  4117. value_t *v1 = self->bonds->value;
  4118. value_t *v2 = self->bonds->next->value;
  4119. if (v1->tag == VERB) {
  4120. for (;;) {
  4121. if (!value_is_truthy(apply_dyad(state, v1, x, y)))
  4122. break;
  4123. x = apply_dyad(state, v2, x, y);
  4124. }
  4125. } else if (v1->tag == NUMBER) {
  4126. size_t k = (size_t)fabs(v1->val.number);
  4127. for (size_t i = 0; i < k; i++)
  4128. x = apply_dyad(state, v2, x, y);
  4129. }
  4130. return x;
  4131. }
  4132. value_t *_conjunction_rank_monad(interpreter_t *state, verb_t *self,
  4133. value_t *x) {
  4134. value_t *v1 = self->bonds->value;
  4135. value_t *v2 = self->bonds->next->value;
  4136. if (v1->tag != VERB || v2->tag != NUMBER)
  4137. return state->udf;
  4138. unsigned int rank =
  4139. v2->val.number == INFINITY ? UINT_MAX : fabs(v2->val.number);
  4140. return each_rank(state, v1->val.verb, x, 0, rank);
  4141. }
  4142. value_t *_conjunction_rank_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4143. value_t *y) {
  4144. value_t *v1 = self->bonds->value;
  4145. value_t *v2 = self->bonds->next->value;
  4146. if (v1->tag != VERB || v2->tag != NUMBER)
  4147. return state->udf;
  4148. unsigned int rank =
  4149. v2->val.number == INFINITY ? UINT_MAX : fabs(v2->val.number);
  4150. return together(state, v1->val.verb, x, y, 0, 0, rank, rank);
  4151. }
  4152. value_t *_conjunction_monaddyad_monad(interpreter_t *state, verb_t *self,
  4153. value_t *x) {
  4154. value_t *v = self->bonds->value;
  4155. if (v->tag != VERB)
  4156. return state->udf;
  4157. return each_rank(state, v->val.verb, x, 0, v->val.verb->rank[0]);
  4158. }
  4159. value_t *_conjunction_monaddyad_dyad(interpreter_t *state, verb_t *self,
  4160. value_t *x, value_t *y) {
  4161. value_t *v = self->bonds->next->value;
  4162. if (v->tag != VERB)
  4163. return state->udf;
  4164. return together(state, v->val.verb, x, y, 0, 0, v->val.verb->rank[1],
  4165. v->val.verb->rank[2]);
  4166. }
  4167. value_t *_conjunction_if_monad(interpreter_t *state, verb_t *self,
  4168. value_t *x) {
  4169. value_t *v1 = self->bonds->value;
  4170. value_t *v2 = self->bonds->next->value;
  4171. if (v1->tag != VERB || v2->tag != VERB)
  4172. return state->udf;
  4173. value_t *b = apply_monad(state, v2, x);
  4174. if (value_is_truthy(b))
  4175. return x;
  4176. return apply_monad(state, v1, x);
  4177. }
  4178. value_t *_conjunction_if_dyad(interpreter_t *state, verb_t *self,
  4179. value_t *x, value_t *y) {
  4180. value_t *v1 = self->bonds->value;
  4181. value_t *v2 = self->bonds->next->value;
  4182. if (v1->tag != VERB || v2->tag != VERB)
  4183. return state->udf;
  4184. value_t *b = apply_dyad(state, v2, x, y);
  4185. if (value_is_truthy(b))
  4186. return y;
  4187. return apply_dyad(state, v1, x, y);
  4188. }
  4189. value_t *_conjunction_under_monad(interpreter_t *state, verb_t *self,
  4190. value_t *x) {
  4191. value_t *v1 = self->bonds->value;
  4192. value_t *v2 = self->bonds->next->value;
  4193. if (v1->tag != VERB || v2->tag != VERB)
  4194. return state->udf;
  4195. verb_t *iv = table_get(Inverses, v2->val.verb->name);
  4196. if (!iv)
  4197. return state->udf;
  4198. value_t *v = apply_monad(state, v2, x);
  4199. v = apply_monad(state, v1, v);
  4200. return each_rank(state, iv, v, 0, iv->rank[0]);
  4201. }
  4202. value_t *_conjunction_under_dyad(interpreter_t *state, verb_t *self,
  4203. value_t *x, value_t *y) {
  4204. value_t *v1 = self->bonds->value;
  4205. value_t *v2 = self->bonds->next->value;
  4206. if (v1->tag != VERB || v2->tag != VERB)
  4207. return state->udf;
  4208. verb_t *iv = table_get(Inverses, v2->val.verb->name);
  4209. if (!iv)
  4210. return state->udf;
  4211. value_t *a = apply_monad(state, v2, x);
  4212. value_t *b = apply_monad(state, v2, y);
  4213. value_t *v = apply_dyad(state, v1, a, b);
  4214. return each_rank(state, iv, v, 0, iv->rank[0]);
  4215. }
  4216. #define CONJUNCTION(__name, __symb) \
  4217. verb_t *conjunction_##__name(interpreter_t *state, value_t *x, value_t *y) { \
  4218. verb_t *nv = verb_new(); \
  4219. nv->bonds = list_new(); \
  4220. list_push(nv->bonds, x); \
  4221. list_push(nv->bonds, y); \
  4222. char *rx = value_show(x); \
  4223. char *ry = value_show(y); \
  4224. size_t l = strlen(rx) + strlen(ry) + strlen(__symb) + 1; \
  4225. nv->name = malloc_checked(l); \
  4226. snprintf(nv->name, l, "%s" __symb "%s", rx, ry); \
  4227. GC_FREE(rx); \
  4228. GC_FREE(ry); \
  4229. nv->rank[0] = 0; \
  4230. nv->rank[1] = 0; \
  4231. nv->rank[1] = 0; \
  4232. nv->monad = _conjunction_##__name##_monad; \
  4233. nv->dyad = _conjunction_##__name##_dyad; \
  4234. return nv; \
  4235. }
  4236. CONJUNCTION(bond, ";");
  4237. CONJUNCTION(pick, "?.");
  4238. CONJUNCTION(while, "?:");
  4239. CONJUNCTION(rank, "\":");
  4240. CONJUNCTION(monaddyad, ";:");
  4241. CONJUNCTION(if, "&:");
  4242. CONJUNCTION(under, "^:");
  4243. adverb_t CONJUNCTIONS[] = {{";", NULL, conjunction_bond},
  4244. {"?.", NULL, conjunction_pick},
  4245. {"?:", NULL, conjunction_while},
  4246. {"\":", NULL, conjunction_rank},
  4247. {";:", NULL, conjunction_monaddyad},
  4248. {"&:", NULL, conjunction_if},
  4249. {"^:", NULL, conjunction_under}};
  4250. #define countof(x) (sizeof(x) / sizeof((x)[0]))
  4251. #define FINDER(kind, rname, table) \
  4252. kind *find_##rname (char *s) { \
  4253. for (size_t i = 0; i < countof(table); i++) { \
  4254. if (strcmp(table[i].name, s) == 0) \
  4255. return &table[i]; \
  4256. } \
  4257. return NULL; \
  4258. }
  4259. FINDER(verb_t, verb, VERBS);
  4260. FINDER(adverb_t, adverb, ADVERBS);
  4261. FINDER(adverb_t, conjunction, CONJUNCTIONS);
  4262. node_t *node_new(enum node_tag_t tag) {
  4263. node_t *node = malloc_checked(sizeof(node_t));
  4264. node->tag = tag;
  4265. return node;
  4266. }
  4267. node_t *node_new_strand(list_t *l) {
  4268. node_t *node = malloc_checked(sizeof(node_t));
  4269. node->tag = N_STRAND;
  4270. node->l = l;
  4271. return node;
  4272. }
  4273. node_t *node_new_literal(value_t *v) {
  4274. node_t *node = malloc_checked(sizeof(node_t));
  4275. node->tag = N_LITERAL;
  4276. node->v = v;
  4277. return node;
  4278. }
  4279. node_t *node_new1(enum node_tag_t tag, node_t *a) {
  4280. node_t *node = malloc_checked(sizeof(node_t));
  4281. node->tag = tag;
  4282. node->a = a;
  4283. return node;
  4284. }
  4285. node_t *node_new2(enum node_tag_t tag, node_t *a, node_t *b) {
  4286. node_t *node = malloc_checked(sizeof(node_t));
  4287. node->tag = tag;
  4288. node->a = a;
  4289. node->b = b;
  4290. return node;
  4291. }
  4292. node_t *node_new3(enum node_tag_t tag, node_t *a, node_t *b, node_t *c) {
  4293. node_t *node = malloc_checked(sizeof(node_t));
  4294. node->tag = tag;
  4295. node->a = a;
  4296. node->b = b;
  4297. node->c = c;
  4298. return node;
  4299. }
  4300. typedef struct {
  4301. lexer_t *lexer;
  4302. interpreter_t *state;
  4303. size_t pos;
  4304. size_t end;
  4305. } parser_t;
  4306. parser_t *parser_new(interpreter_t *state) {
  4307. parser_t *parser = malloc_checked(sizeof(parser_t));
  4308. parser->state = state;
  4309. return parser;
  4310. }
  4311. void parser_error(parser_t *parser, char *s) { fatal(s); }
  4312. bool parser_done(parser_t *parser) { return parser->pos >= parser->end; }
  4313. token_t *parser_lookahead(parser_t *parser, size_t offset) {
  4314. size_t pos = parser->pos + offset;
  4315. if (pos >= parser->end)
  4316. return NULL;
  4317. return list_index(parser->lexer->tokens, pos);
  4318. }
  4319. bool parser_stop(parser_t *parser) {
  4320. token_t *tok = parser_lookahead(parser, 0);
  4321. if (!tok)
  4322. return true;
  4323. return tok->tag == T_RPAR;
  4324. }
  4325. void parser_eat(parser_t *parser) {
  4326. if (!parser_done(parser))
  4327. parser->pos++;
  4328. }
  4329. node_t *parser_parse_expr(parser_t *parser);
  4330. node_t *parser_parse_verb(parser_t *parser) {
  4331. token_t *tok = parser_lookahead(parser, 0);
  4332. if (!tok || tok->tag != T_PUNCT)
  4333. return NULL;
  4334. verb_t *verb = find_verb(tok->text);
  4335. if (!verb)
  4336. return NULL;
  4337. return node_new_literal(value_new_verb(verb));
  4338. }
  4339. value_t *_adverb_wrapper_monad(interpreter_t *state, verb_t *self, value_t *x) {
  4340. adverb_t *av = self->bonds->value;
  4341. if (x->tag != VERB)
  4342. return state->nil;
  4343. return value_new_verb(av->adverb(state, x));
  4344. }
  4345. value_t *_adverb_wrapper_dyad(interpreter_t *state, verb_t *self, value_t *x,
  4346. value_t *y) {
  4347. adverb_t *av = self->bonds->value;
  4348. if (x->tag != VERB)
  4349. return state->nil;
  4350. verb_t *v = av->adverb(state, x);
  4351. return each_rank(state, v, y, 0, v->rank[0]);
  4352. }
  4353. node_t *parser_parse_adverb_atom(parser_t *parser) {
  4354. token_t *tok = parser_lookahead(parser, 0);
  4355. if (!tok || tok->tag != T_PUNCT)
  4356. return NULL;
  4357. adverb_t *adverb = find_adverb(tok->text);
  4358. if (!adverb)
  4359. return NULL;
  4360. verb_t *nv = verb_new();
  4361. nv->name = strdup_checked(tok->text);
  4362. nv->bonds = list_new();
  4363. list_push(nv->bonds, adverb);
  4364. nv->rank[0] = 0;
  4365. nv->rank[1] = 0;
  4366. nv->rank[2] = 0;
  4367. nv->monad = _adverb_wrapper_monad;
  4368. nv->dyad = _adverb_wrapper_dyad;
  4369. return node_new_literal(value_new_verb(nv));
  4370. }
  4371. value_t *_conjunction_wrapper_dyad(interpreter_t *state, verb_t *self,
  4372. value_t *x, value_t *y) {
  4373. adverb_t *av = self->bonds->value;
  4374. return value_new_verb(av->conjunction(state, x, y));
  4375. }
  4376. node_t *parser_parse_conjunction_atom(parser_t *parser) {
  4377. token_t *tok = parser_lookahead(parser, 0);
  4378. if (!tok || tok->tag != T_PUNCT)
  4379. return NULL;
  4380. adverb_t *adverb = find_conjunction(tok->text);
  4381. if (!adverb)
  4382. return NULL;
  4383. verb_t *nv = verb_new();
  4384. nv->name = strdup_checked(tok->text);
  4385. nv->bonds = list_new();
  4386. list_push(nv->bonds, adverb);
  4387. nv->rank[0] = 0;
  4388. nv->rank[1] = 0;
  4389. nv->rank[2] = 0;
  4390. nv->monad = NULL;
  4391. nv->dyad = _conjunction_wrapper_dyad;
  4392. return node_new_literal(value_new_verb(nv));
  4393. }
  4394. node_t *parser_parse_atom(parser_t *parser) {
  4395. token_t *tok = parser_lookahead(parser, 0);
  4396. node_t *node = NULL;
  4397. switch (tok->tag) {
  4398. case T_RPAR:
  4399. parser_error(parser, "unmatched");
  4400. case T_LPAR:
  4401. parser_eat(parser);
  4402. tok = parser_lookahead(parser, 0);
  4403. if (tok && tok->tag == T_RPAR) {
  4404. node = node_new_literal(parser->state->unit);
  4405. break;
  4406. }
  4407. node = parser_parse_expr(parser);
  4408. tok = parser_lookahead(parser, 0);
  4409. if (!tok || tok->tag != T_RPAR)
  4410. parser_error(parser, "unmatched");
  4411. break;
  4412. case T_PUNCT:
  4413. node = parser_parse_verb(parser);
  4414. if (!node)
  4415. node = parser_parse_adverb_atom(parser);
  4416. if (!node)
  4417. node = parser_parse_conjunction_atom(parser);
  4418. if (!node)
  4419. parser_error(parser, "parse");
  4420. break;
  4421. case T_NUMBER:
  4422. node = node_new_literal(value_new_number(strtod(tok->text, NULL)));
  4423. break;
  4424. case T_NAME:
  4425. node = node_new_literal(value_new_symbol(strdup_checked(tok->text)));
  4426. break;
  4427. case T_QUOTE:
  4428. if (!*tok->text)
  4429. node = node_new_literal(parser->state->unit);
  4430. else if (!*(tok->text + 1))
  4431. node = node_new_literal(value_new_char(tok->text[0]));
  4432. else {
  4433. list_t *list = list_new();
  4434. for (size_t i = 0; i < strlen(tok->text); i++)
  4435. list_push(list, value_new_char(tok->text[i]));
  4436. node = node_new_literal(value_new_array(list));
  4437. }
  4438. break;
  4439. }
  4440. if (!node)
  4441. parser_error(parser, "parse");
  4442. parser_eat(parser);
  4443. return node;
  4444. }
  4445. node_t *parser_parse_sequence(parser_t *parser, node_t *a,
  4446. enum token_tag_t tag) {
  4447. token_t *tok;
  4448. if ((tok = parser_lookahead(parser, 0)) && tok->tag == tag) {
  4449. list_t *as = list_new();
  4450. list_push(as, a->v);
  4451. do {
  4452. a = parser_parse_atom(parser);
  4453. list_push(as, a->v);
  4454. } while ((tok = parser_lookahead(parser, 0)) && tok->tag == tag);
  4455. return node_new_literal(value_new_array(as));
  4456. }
  4457. return NULL;
  4458. }
  4459. node_t *_parser_parse_noun(parser_t *parser) {
  4460. node_t *n;
  4461. node_t *a = parser_parse_atom(parser);
  4462. if (a->tag == N_LITERAL && a->v->tag == NUMBER &&
  4463. (n = parser_parse_sequence(parser, a, T_NUMBER)))
  4464. return n;
  4465. else if (a->tag == N_LITERAL && a->v->tag == SYMBOL &&
  4466. (n = parser_parse_sequence(parser, a, T_NAME)))
  4467. return n;
  4468. else if (a->tag == N_LITERAL && a->v->tag == ARRAY &&
  4469. is_char_array(a->v->val.array) &&
  4470. (n = parser_parse_sequence(parser, a, T_QUOTE)))
  4471. return n;
  4472. return a;
  4473. }
  4474. node_t *parser_parse_noun(parser_t *parser, bool flat) {
  4475. node_t *a = flat ? parser_parse_atom(parser) : _parser_parse_noun(parser);
  4476. token_t *tok;
  4477. if ((tok = parser_lookahead(parser, 0)) && tok->tag == T_PUNCT &&
  4478. strcmp(tok->text, ",:") == 0) {
  4479. parser_eat(parser);
  4480. list_t *l = list_new();
  4481. list_push(l, a);
  4482. for (;;) {
  4483. a = flat ? parser_parse_atom(parser) : _parser_parse_noun(parser);
  4484. list_push(l, a);
  4485. if (!((tok = parser_lookahead(parser, 0)) && tok->tag == T_PUNCT &&
  4486. strcmp(tok->text, ",:") == 0))
  4487. break;
  4488. parser_eat(parser);
  4489. }
  4490. return node_new_strand(l);
  4491. }
  4492. return a;
  4493. }
  4494. bool parser_node_is_verbal(parser_t *parser, node_t *n) {
  4495. value_t *v;
  4496. if (n->tag == N_FUN)
  4497. return true;
  4498. else if (n->tag == N_ADV || n->tag == N_CONJ || n->tag == N_PARTIAL_CONJ)
  4499. return true;
  4500. else if (n->tag == N_FORK || n->tag == N_HOOK || n->tag == N_BOND ||
  4501. n->tag == N_OVER)
  4502. return true;
  4503. else if (n->tag == N_LITERAL && n->v->tag == VERB)
  4504. return true;
  4505. else if (n->tag == N_LITERAL && n->v->tag == SYMBOL &&
  4506. (v = table_get(parser->state->env, n->v->val.symbol)) &&
  4507. v->tag == VERB)
  4508. return true;
  4509. return false;
  4510. }
  4511. node_t *parser_parse_adverb(parser_t *parser, node_t *v, bool *flag) {
  4512. token_t *tok;
  4513. adverb_t *adv;
  4514. node_t *t;
  4515. for (;;) {
  4516. tok = parser_lookahead(parser, 0);
  4517. if (!tok || tok->tag != T_PUNCT)
  4518. break;
  4519. if ((adv = find_adverb(tok->text))) {
  4520. if (flag)
  4521. *flag = true;
  4522. parser_eat(parser);
  4523. t = node_new(N_ADV);
  4524. t->av = adv;
  4525. t->a = v;
  4526. v = t;
  4527. } else
  4528. break;
  4529. }
  4530. return v;
  4531. }
  4532. node_t *parser_parse_conjunction(parser_t *parser, node_t *v, bool *flag) {
  4533. token_t *tok;
  4534. adverb_t *adv;
  4535. node_t *t;
  4536. for (;;) {
  4537. tok = parser_lookahead(parser, 0);
  4538. if (!tok || tok->tag != T_PUNCT)
  4539. break;
  4540. if ((adv = find_conjunction(tok->text))) {
  4541. if (flag)
  4542. *flag = true;
  4543. parser_eat(parser);
  4544. if (parser_stop(parser)) {
  4545. t = node_new(N_PARTIAL_CONJ);
  4546. t->av = adv;
  4547. t->a = v;
  4548. } else {
  4549. t = node_new(N_CONJ);
  4550. t->av = adv;
  4551. t->a = v;
  4552. t->b = parser_parse_noun(parser, true);
  4553. }
  4554. v = t;
  4555. } else
  4556. break;
  4557. }
  4558. return v;
  4559. }
  4560. bool is_apply(node_t *n) {
  4561. return n->tag == N_LITERAL && n->v->tag == VERB &&
  4562. (strcmp(n->v->val.verb->name, "`.") == 0 ||
  4563. strcmp(n->v->val.verb->name, "`:") == 0);
  4564. }
  4565. bool is_obverse(node_t *n) {
  4566. return n->tag == N_LITERAL && n->v->tag == VERB && strcmp(n->v->val.verb->name, "::") == 0;
  4567. }
  4568. node_t *parser_parse_expr(parser_t *parser) {
  4569. token_t *tmp;
  4570. list_t *ns = list_new();
  4571. while (!parser_stop(parser)) {
  4572. if (list_empty(ns) && (tmp = parser_lookahead(parser, 0)) &&
  4573. tmp->tag == T_PUNCT && strcmp(tmp->text, ":") == 0 &&
  4574. (parser_lookahead(parser, 1))) {
  4575. parser_eat(parser);
  4576. return node_new1(N_FUN, parser_parse_expr(parser));
  4577. }
  4578. node_t *n = parser_parse_noun(parser, false);
  4579. if (list_empty(ns) && n->tag == N_LITERAL && n->v->tag == SYMBOL &&
  4580. (tmp = parser_lookahead(parser, 0)) && tmp->tag == T_PUNCT &&
  4581. strcmp(tmp->text, ":") == 0) {
  4582. parser_eat(parser);
  4583. return node_new2(N_BIND, n, parser_parse_expr(parser));
  4584. }
  4585. for (;;) {
  4586. bool flag = false;
  4587. n = parser_parse_adverb(parser, n, &flag);
  4588. n = parser_parse_conjunction(parser, n, &flag);
  4589. if (!flag)
  4590. break;
  4591. }
  4592. list_push(ns, n);
  4593. }
  4594. size_t len;
  4595. node_t *l, *m, *r;
  4596. for (;;) {
  4597. len = list_length(ns);
  4598. if (len < 2)
  4599. break;
  4600. if (len >= 3 && is_apply(list_index(ns, -2)) || is_obverse(list_index(ns, -2))) {
  4601. r = list_pop(ns);
  4602. m = list_pop(ns);
  4603. l = list_pop(ns);
  4604. list_push(ns, node_new3(N_DYAD, m, l, r));
  4605. } else if (len >= 3 && !parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4606. parser_node_is_verbal(parser, list_index(ns, -2)) &&
  4607. !parser_node_is_verbal(parser, list_index(ns, -3))) {
  4608. r = list_pop(ns);
  4609. m = list_pop(ns);
  4610. l = list_pop(ns);
  4611. list_push(ns, node_new3(N_DYAD, m, l, r));
  4612. } else if (len >= 3 && parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4613. parser_node_is_verbal(parser, list_index(ns, -2)) &&
  4614. parser_node_is_verbal(parser, list_index(ns, -3))) {
  4615. r = list_pop(ns);
  4616. m = list_pop(ns);
  4617. l = list_pop(ns);
  4618. list_push(ns, node_new3(N_FORK, l, m, r));
  4619. } else if (len >= 3 && parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4620. parser_node_is_verbal(parser, list_index(ns, -2)) &&
  4621. !parser_node_is_verbal(parser, list_index(ns, -3))) {
  4622. r = list_pop(ns);
  4623. m = list_pop(ns);
  4624. l = list_pop(ns);
  4625. list_push(ns, node_new3(N_OVER, l, m, r));
  4626. } else if (len >= 2 && is_apply(list_index(ns, -1))) {
  4627. r = list_pop(ns);
  4628. l = list_pop(ns);
  4629. list_push(ns, node_new2(N_BOND, r, l));
  4630. } else if (len >= 2 && !parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4631. parser_node_is_verbal(parser, list_index(ns, -2))) {
  4632. r = list_pop(ns);
  4633. l = list_pop(ns);
  4634. list_push(ns, node_new2(N_MONAD, l, r));
  4635. } else if (len >= 2 && parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4636. parser_node_is_verbal(parser, list_index(ns, -2))) {
  4637. r = list_pop(ns);
  4638. l = list_pop(ns);
  4639. list_push(ns, node_new2(N_HOOK, l, r));
  4640. } else if (len >= 2 && parser_node_is_verbal(parser, list_index(ns, -1)) &&
  4641. !parser_node_is_verbal(parser, list_index(ns, -2))) {
  4642. r = list_pop(ns);
  4643. l = list_pop(ns);
  4644. list_push(ns, node_new2(N_BOND, r, l));
  4645. } else if (len >= 3) {
  4646. r = list_pop(ns);
  4647. m = list_pop(ns);
  4648. l = list_pop(ns);
  4649. list_push(ns, node_new3(N_INDEX2, m, l, r));
  4650. } else if (len >= 2) {
  4651. r = list_pop(ns);
  4652. l = list_pop(ns);
  4653. list_push(ns, node_new2(N_INDEX1, l, r));
  4654. }
  4655. }
  4656. return ns->value;
  4657. }
  4658. node_t *parser_parse(parser_t *parser, lexer_t *lexer) {
  4659. parser->lexer = lexer;
  4660. parser->pos = 0;
  4661. parser->end = list_length(parser->lexer->tokens);
  4662. node_t *node = parser_parse_expr(parser);
  4663. if (!parser_done(parser)) {
  4664. token_t *tok = parser_lookahead(parser, 0);
  4665. if (tok && tok->tag == T_RPAR)
  4666. parser_error(parser, "unmatched");
  4667. parser_error(parser, "parse");
  4668. }
  4669. return node;
  4670. }
  4671. value_t *interpreter_run(interpreter_t *state, char *program) {
  4672. lexer_t *lexer = lexer_new();
  4673. lexer_lex(lexer, program);
  4674. parser_t *parser = parser_new(state);
  4675. node_t *node = parser_parse(parser, lexer);
  4676. list_t *t = lexer->tokens;
  4677. if (t->value)
  4678. while (t) {
  4679. list_t *tmp = t->next;
  4680. token_t *tok = t->value;
  4681. if (tok->text)
  4682. GC_FREE(tok->text);
  4683. GC_FREE(tok);
  4684. GC_FREE(t);
  4685. t = tmp;
  4686. }
  4687. value_t *r = interpreter_walk(state, node);
  4688. GC_FREE(parser);
  4689. return r;
  4690. }
  4691. #include "help.h"
  4692. const char *VSTR = VER " " __DATE__;
  4693. int main(int argc, char **argv) {
  4694. GC_INIT();
  4695. GC_enable_incremental();
  4696. guards = list_new();
  4697. is_interactive = isatty(0);
  4698. HASH_SEED = time(NULL);
  4699. srand(HASH_SEED);
  4700. VCACHE = table_new();
  4701. SCACHE = table_new();
  4702. for (size_t i = 0; i < countof(VERBS); i++) {
  4703. value_t *v = value_new_const(VERB);
  4704. v->val.verb = &VERBS[i];
  4705. table_set(VCACHE, VERBS[i].name, v);
  4706. }
  4707. _UNIT = value_new(ARRAY);
  4708. _UNIT->val.array = list_new();
  4709. interpreter_t *state = interpreter_new();
  4710. for (int i = 1; i <= 8; i++) {
  4711. NNUMS[i - 1] = value_new_const(NUMBER);
  4712. NNUMS[i - 1]->val.number = -i;
  4713. }
  4714. for (int i = 0; i < 256; i++) {
  4715. NUMS[i] = value_new_const(NUMBER);
  4716. NUMS[i]->val.number = i;
  4717. }
  4718. for (int i = 0; i < 256; i++) {
  4719. CHARS[i] = value_new_const(CHAR);
  4720. CHARS[i]->val._char = i;
  4721. }
  4722. _NAN = value_new_const(NUMBER);
  4723. _NAN->val.number = NAN;
  4724. INF = value_new_const(NUMBER);
  4725. INF->val.number = INFINITY;
  4726. NINF = value_new_const(NUMBER);
  4727. NINF->val.number = -INFINITY;
  4728. list_t *vs = list_new();
  4729. for (size_t i = 0; i < strlen(VSTR); i++)
  4730. list_push(vs, CHARS[VSTR[i]]);
  4731. table_set(state->env, "JKV", value_new_array(vs));
  4732. table_set(state->env, "E", value_new_number(exp(1)));
  4733. table_set(state->env, "pi", value_new_number(M_PI));
  4734. table_set(state->env, "tau", value_new_number(M_PI*2));
  4735. table_set(state->env, "nan", _NAN);
  4736. table_set(state->env, "inf", INF);
  4737. table_set(state->env, "nil", state->nil);
  4738. table_set(state->env, "udf", state->udf);
  4739. Inverses = table_new();
  4740. table_set(Inverses, "+", find_verb("+"));
  4741. table_set(Inverses, "-", find_verb("-"));
  4742. table_set(Inverses, "|", find_verb("|"));
  4743. table_set(Inverses, "~", find_verb("~"));
  4744. table_set(Inverses, "%", find_verb("%"));
  4745. table_set(Inverses, "]", find_verb("]"));
  4746. table_set(Inverses, "*:", find_verb("%:"));
  4747. table_set(Inverses, "%:", find_verb("*:"));
  4748. table_set(Inverses, ">", find_verb("<"));
  4749. table_set(Inverses, "<", find_verb(">"));
  4750. table_set(Inverses, "_.", find_verb("_:"));
  4751. table_set(Inverses, "_:", find_verb("_."));
  4752. table_set(Inverses, "^.", find_verb("^"));
  4753. table_set(Inverses, "^", find_verb("^."));
  4754. table_set(Inverses, "+;.", find_verb("%:"));
  4755. table_set(Inverses, "*/", find_verb("["));
  4756. table_set(Inverses, "[", interpreter_run(state, "*/")->val.verb);
  4757. table_set(Inverses, "!", interpreter_run(state, ">|/")->val.verb);
  4758. table_set(Inverses, "!.", interpreter_run(state, "|/")->val.verb);
  4759. table_set(Inverses, "]@>:", interpreter_run(state, "]@<:")->val.verb);
  4760. table_set(Inverses, "]@<:", interpreter_run(state, "]@>:")->val.verb);
  4761. list_t *args = list_new();
  4762. for (int i = 1; i < argc; i++) {
  4763. list_t *arg = list_new();
  4764. char *s = argv[i];
  4765. while (*s)
  4766. list_push(arg, CHARS[*s++]);
  4767. list_push(args, value_new_array(arg));
  4768. }
  4769. table_set(state->env, "args", value_new_array(args));
  4770. if (is_interactive)
  4771. printf("jk\t\\\\ to exit \\ for help\n");
  4772. char *s = NULL;
  4773. if (is_interactive)
  4774. setjmp(interactive_checkpoint);
  4775. if (s) {
  4776. GC_FREE(s); s = NULL;
  4777. }
  4778. for (;;) {
  4779. buffer_t *buffer;
  4780. char line[256];
  4781. buffer = buffer_new();
  4782. if (is_interactive)
  4783. putc('\t', stdout);
  4784. if (!fgets(line, sizeof(line), stdin))
  4785. break;
  4786. if (is_interactive) {
  4787. if (strcmp(line, "\\\\\n") == 0)
  4788. break;
  4789. else if (strcmp(line, "\\\n") == 0) {
  4790. printf("%s", HELP);
  4791. continue;
  4792. }
  4793. else if (strcmp(line, "\\0\n") == 0) {
  4794. printf("%s", SHELP);
  4795. continue;
  4796. }
  4797. else if (strcmp(line, "\\+\n") == 0) {
  4798. printf("%s", VHELP);
  4799. continue;
  4800. }
  4801. else if (strcmp(line, "\\a\n") == 0) {
  4802. printf("%s", V2HELP);
  4803. continue;
  4804. }
  4805. else if (strcmp(line, "\\\"\n") == 0) {
  4806. printf("%s", AHELP);
  4807. continue;
  4808. }
  4809. else if (strcmp(line, "\\;\n") == 0) {
  4810. printf("%s", CHELP);
  4811. continue;
  4812. }
  4813. else if (strcmp(line, "\\-:\n") == 0) {
  4814. printf("%s", IHELP);
  4815. continue;
  4816. }
  4817. }
  4818. while (strlen(line) > 2 && strcmp(line+strlen(line)-3, "..\n") == 0) {
  4819. line[strlen(line) - 3] = 0;
  4820. buffer_append_str(buffer, line);
  4821. if (is_interactive)
  4822. putc('\t', stdout);
  4823. if (!fgets(line, sizeof(line), stdin))
  4824. return 0;
  4825. }
  4826. buffer_append_str(buffer, line);
  4827. s = buffer_read(buffer);
  4828. value_t *v = interpreter_run(state, s);
  4829. GC_FREE(s); s = NULL;
  4830. if (v->tag != NIL) {
  4831. table_set(state->env, "it", v);
  4832. char *s = value_show(v);
  4833. fputs(s, stdout);
  4834. if (is_interactive)
  4835. putc('\n', stdout);
  4836. }
  4837. }
  4838. }