MenuForside/BlogadenTeksterUfnetMusikNoerderierSozialOm

Lav noget der regner del 2 - ComCalc

Det regner. Det er pissenederen efterår. Man skvatter rundt i gule blade og ned ad trapper, han ad fortove og ned i mudderet. Og så fandt jeg et projekt her der aldrig rigigt er blevet færdigt. Ikke her på siden, i hvert fald.

For over to år siden lavede jeg en beretning om en lommeregner jeg havde lavet. Den gang kunne jeg kikke tilbage på min første lommeregner og grine uhæmmet, den kan ses her. Nu kan jeg tilgengæld kikke tilbage på min sidste lommeregner og grine måske ikke nær så uhæmmet, men alligevel. Altså ComCalc version 1 (der står godt nok 2.0):

I mellemtiden har jeg lavet en hel del programmeringssprog. Og det at lave en lommeregner har en del at gøre med det at lave et programmeringssprog. Så jeg præsenterer hermed næste iteration af ComCalc.

ComCalc 1

Den første version som vist ovenfor. Den er lavet på følgende måde i JS. Observer følgende stykke: $$1 + 2 + 3 + 4 \cdot 5$$

Hvad giver det? Det giver: $$1 + 2 = 3 + 3 = 6 + 4 \cdot 5 = 6 + 20 = 26$$ Vi introducerer regnehierarki eller præcedens, man ganger før man plusser. En anden måde at udtrykke stykket på kan være: $$(((1 + 2) + 3) + (4 * 5))$$ eller $$(+\ (+\ (+\ 1\ 2)\ 3)\ (*\ 4\ 5))$$ Hvor operatorerne i sidste står som præfiks. Lad os lige huske på disse notationer og vende tilbage til min to år gamle løsning. Tag ovenstående stykke, for to år siden løste jeg det ved dele det op i to lister:

var tal = [1,2,3,4,5]; var op = [+,+,+,*];

Herefter pløjede jeg dem igennem, tog ét element ud af op og to ud af tal, regnede de to tal sammen, erstattede det sidste tal med resultatet og fortsatte. ComCalc, min 2 år gamle regner, lavede selvfølgelig et gennemløb først og kikkede efter * eller /, derefter et gennemløb hvor den kikkede efter + eller -. På den måde blev præcedenses bevaret.

Jeg synes ikke det er nogen dårlig løsning, den fungerer da der altid er én mindre operator end antal tal eller operander i et korrekt angivet regnestykke. Problemet kommer når parenteser introduceres. Så vidt jeg lige kan se, løste jeg parenteser ved at lave en separat liste med dem og funktioner som regnes først. Og herefter bliver det noget indviklet.

Den overordnede ide var og er nu i hvert fald den samme:

Det første og sidste punkt er faktisk de nemmeste, det i mellem er til gengæld det vigtigste for at bevare en overskuelighed.

ComCalc 2

Som sagt er denne skabt som man bygger et programmeringssprog. Detaljer i projektet kan findes her. Lommeregneren er blevet en del af en hel terminal, den kan prøves her:

For at regne, skrive comcalc "udtryk" hvor udtryk er et matematisk udtryk. Feks.

comcalc "2+2*2"