7. heinäkuu 2012, 17:58

Soulver-kloonia rakentelemassa

Erittäin upealla konseptilla varustettu laskinohjelma Soulver kaatuu siihen, että sen saa vain Mäkille. Vapaamuotoinen näpertelyalusta on usein ainut asia, mitä laskimestani kaipaa. Ja erityisesti listata selväkielisesti jotain asioita ja lukuarvoja, ja saada niistä summaus selvästi esille. Eikä sellaista voi edes isommilla ohjelmilla kuten Maplella kunnolla emuloida. Koska Mäkkiä en nyt viitsi ostaa pelkän yhden sovelluksen takia, on jäljellä vaihtoehto kirjoittaa oma Soulver-like.

Ensin puntaroin GUI-ohjelman perään: asialle laitettaisiin Clojure ja Swing-kirjasto. Sitten tulin järkiini, ja pohdin TUI-ohjelmaa: Python ja ncurses-kirjasto. Yhtä nopeasti säpsähdin siitäkin, sillä vapaamuotoisen kirjoittelualustan olisi syytä olla parempi kuin huonompi. Välitön seuraus: projekti rakennetaan Vimin päälle. Vim tarjoaa editointikomennot, syntaksivärityksen ja Python-integraation. Kehittelyn aloitan Python-parsimen kanssa siten, että voin komentoriviltä käsin testailla. Sitten kun homma alkaa luistaa kunnolla, integroin sen vain vim-puskuriin sopivan skriptin kanssa, ja meillä on valmiina uusi Vim-skripti. Emacsissa on jo org-table, joka osaa tehdä about samoja asioita kuin tämä. Alusta ja kieli on täten valittu.

Mitä asioita tällä valitsemallani tiellä voidaan saavuttaa? Ensinnäkin pitäytyen puhtaassa tekstissä menetän esteettisyyttä, mutta saan tilalle ääriluotettavaa laskentaa. Kaikkea voi seurata tarkkaan tekstistä, ja tietokone ei näe sen enempää kuin ihmissilmä. WYSIAG-ilmiöltä säästytään. Rivejä voi kommentoida nopeasti mitätöimään jokin tietty termi. Lopulliseen ratkaisuun ajattelin myös nimettyjä muuttujia, jolloin ykskaks yllättäen tämä pikku projekti vastaakin sitä rakenteista taulukkolaskentaa, josta haaveilin muutama kuukausi sitten.

Liian hyvää ollakseen totta? No, toistaiseksi kaikki näyttää valoisalta. Olen hakkaillut python-purkkaa noin satarivisen paketin kasaan. Seuraavanlainen testidemo, mitä skripti tällä hetkellä konkreettisesti osaa tehdä:

hifit                       2000 €
penkit                      <4*250> €
jako kahteen                <2000/4> €

kaikki yhteensä             <@sum> €
puoliksi                    <@sum/2> €
vakuutusyhtiö korvaa        <@sum * 0.85 -150> €

Muuttuu tämännäköiseksi skriptin läpi ujutettuna:

hifit                       2000 €
penkit                      <4*250 = 1000> €
jako kahteen                <2000/4 = 500.0> €

kaikki yhteensä             <@sum = 3500.0> €
puoliksi                    <@sum/2 = 1750.0> €
vakuutusyhtiö korvaa        <@sum * 0.85 -150 = 2825.0> €

Tätä on tarkoitus sitten pyöritellä interaktiiviseen suuntaan valmistuttuaan. Python-skripti on toistaiseksi one-pass -metodiikalla kirjoitettu. Syntaksi on hieman avoinna vielä, ja lukuarvojen poiminta on puutteellinen. Vain rivin viimeinen lukuarvo otetaan mukaan summattavaksi (keskeinen sum-komento).

Syntaksia pitäisi miettiä tarkempaan läpi ja one-pass -semantiikan hyvät puolet haluaisin säilyttää… esimerkiksi sen, että sum-komentoa voi komennella välisummien antamiseksi keskellä laskuja, eikä se häiritse myöhempiä summia.

Ja ne regexitkin ovat varmasti puutteellisia. Kulmasulkeetkin voivat olla rumia, joskin vimin conceal-toiminnon avulla ne voisi halutessaan piilottaa. Tämä idea on niin avoinna toistaiseksi, että minun pitäisi ensin lyödä syntaksi kiveen ja sitten voisin aloittaa yksikkötestien ja lopullisen suunnitelman aukikirjoittamista.

Nyt on paras aika kommentoida, ja jos kovastikin kiinnostaa, niin pusken tämän githubiin näin raakilevaiheessa.

Tageja: , , ,

---
---

---

Aiheen vierestä