Feanathiel schreef op zaterdag 18 april 2020 @ 13:26:
[...]
Het is ook even uitkijken dat je geen onverwachte situaties krijgt. Dus dat bijvoorbeeld operatorEquals([this] number, string) een ander antwoord geeft dan operatorEquals([this] string, number), mocht die bestaan.
Tja, als je equality niet commutatief wil maken moet je dat natuurlijk zelf weten

Waar gebruik je de tool voor, puur uit interesse? Of is het meer een hobby project? Bestaat ook alweer (bijna/ruim)
20 jaar namelijk.

Wow, good find

Niet *helemaal* waar though. Dit kun je zien als de derde complete rewrite

.
Kol Q l8or 1 was niet meer dan een simpele rekenmachine waarbij je een expressie in kon typen, met C-like operatoren en outputs in verschillende bases. Vooral het kunnen intypen en editen van een expressie vond ik heel belangrijk want Windows Calculator modelleert een echt fysieke rekenmachine, waarbij je getallen in kunt voeren en dan op een knop kan rammen, maar naderhand nooit meer de daadwerkelijke berekening iets kan aanpassen. Jammer dat die screenshot niet meer bestaat in die oude post. Kan er ook niets meer over terugvinden op mijn PC of Nas. Volgens mij heb ik de code nog wel ergens op een oude backup CD staan.
Maar goed, Kol Q l8or 1 had al snel zijn tekortkomingen. Ik wilde ook gewoon zelf variabelen en functies kunnen definieren. En ik wilde meer een console achtige interface waarin je alle vorige resultaten kunt terugzien. En zo ontstond dus Kol Q l8or 2 in 2010.
Deze werd uiteindelijk Turing Complete toen ik vectoren en recursie toevoegde

. Maar ik miste wel de echte programmeermogelijkheden, en andere types zoals strings en objecten. Ik gebruikte de Coco/R parser generator, maar ik vond het altijd een hoop werk om een nieuwe feature toe te voegen. Helaas is de code ervan verloren gegaan in de Grote HDD Crash van 2013, dus ik ben weer opnieuw begonnen in 2017.
Mijn interesse hiervoor werd gewekt bij een poging tot het salvagen van bepaalde files van de gecrashte RAID 0 array (1 disk was aan gruzelementen, de andere werkte nog). Ik vond de sourcefile van een bignum library van me terug. De bijbehorende header was corrupt dus die heb ik opnieuw moeten intypen. Nadat ik die enigszins productierijp had gemaakt ging ik er een parser omheen bouwen. Dat mondde uiteindelijk uit in KolQ. De parser hier is een handgeschreven recursive descent parser. Na mijn jarenlange gexperimenteer met verschillende parser generators was ik verbaasd over hoveel makkelijker het is om die dingen gewoon zelf met de hand te schrijven, en hoeveel makkelijker het vervolgens ook is om een feature toe te voegen.
Maar om je vraag te beantwoorden waarom ik dit doe, het voornaamste doel is eigenlijk gewoon interesse

. Compilerbouw heb ik altijd een interessant vakgebied gevonden en zoals je ziet ben ik daar ook veel mee bezig geweest. Maar dit project is meer dan dat, ik gebruik het ook dagelijks bij mijn werk. KolQ is nog niet helemaal productierijp, maar Kol Q l8or 2 is gewoon een tray app die ik elke dag wel even aanklik om gewoon even iets uit te rekenen. Maar laatst zat ik wat code te debuggen (een Delaunay tetrahedralizer) en daarbij moest ik wat matrix bewerkingen verifieren. Er zijn wel wat online tools voor (zoals
deze), maar ik miste iets om een loopje te kunnen doen. En tus ging ik support voor matrices toevoegen aan KolQ.
Het mooie was vooral dat ik dat gewoon kon doen in KolQ zelf, kwestie van even een Matrix klasse definieren en de bijbehorende operaties. Maar ik had nog geen support voor operator overloading, en het zou wel handig zijn om dat hiervoor te hebben, dus toen heb ik dat er ook maar even ingehangen.
Goed, natuurlijk was mijn implementatie natuurlijk niet meteen goed, maar het probleem is dat mijn error reporting nog zeer ondermaats is. Ik moest het doen met "Wrong number of arguments in function call" op het moment dat ik een matrix inverteer. Geen idee welke functie of op welke regel ik dat moest zoeken. Nou heb ik de bug inmiddels al wel gefixed, maar dit stoorde me zo erg dat ik inmiddels allerlei debuginfo aan het toevoegen ben. Zo genereer ik inmiddels callstacks, en hou ik source code locaties bij