Tero Jäntti

Samankaltaiset tiedostot
ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Octave-opas. Mikä on Octave ja miksi? Asennus

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Haskell ohjelmointikielen tyyppijärjestelmä

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

ITKP102 Ohjelmointi 1 (6 op)

5.5 Jäsenninkombinaattoreista

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

TIE Principles of Programming Languages CEYLON

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Luento 5. Timo Savola. 28. huhtikuuta 2006

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka. Joni Korjala APACHE WWW-PALVELIN Seminaarityö 2012

Tiedostonhallinta. Yleistä

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

12. Näppäimistöltä lukeminen 12.1

Pedacode Pikaopas. Web-sovelluksen luominen

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

Loppukurssin järjestelyt

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Clojure, funktionaalinen Lisp murre

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Matlab- ja Maple- ohjelmointi

Ohjelmoinnin perusteet Y Python

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin perusteet Y Python

Valppaan asennus- ja käyttöohje

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Ohjelmoinnin peruskurssien laaja oppimäärä

Loppukurssin järjestelyt C:n edistyneet piirteet

11/20: Konepelti auki

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Tietokannat II -kurssin harjoitustyö

Harjoitus 2 (viikko 45)

MixW ja Dx-vihjeet (ohje) oh3htu

TIEA341 Funktio-ohjelmointi 1, kevät 2008

CMS Made Simple Perusteet

4. Lausekielinen ohjelmointi 4.1

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Common Lisp Object System

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

4. Lausekielinen ohjelmointi 4.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Tikon Ostolaskujenkäsittely/Web-myyntilaskutus versio 6.4.0

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin peruskurssien laaja oppimäärä

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Jypelin käyttöohjeet» Ruutukentän luominen

Luku 5. Monadit. 5.1 Siirrännän ongelma

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmointi 1 / syksy /20: IDE

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

8. Näppäimistöltä lukeminen 8.1

Ohjelmoinnin peruskurssien laaja oppimäärä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Tietorakenteet ja algoritmit

Rajapinta (interface)

Johdatus edistyneeseen web-kehitykseen. Juuso Lappalainen

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

Lyhyt kertaus osoittimista

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

JOHDANTO... 5 PÄÄKONFIGURAATIOTIEDOSTO KIELET KÄYNNISTÄMINEN JOHDANTO... 6

Muuttujien määrittely

ITKP102 Ohjelmointi 1 (6 op)

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tikon Ostolaskujenkäsittely/Web-myyntilaskutus versio 6.3.0

7. Näytölle tulostaminen 7.1

KÄYTTÖOHJE LATOMO VERSO

Osoittimet ja taulukot

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tietokanta (database)

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

Yi Tero Jäntti tekrjant@jyu.fi 22.4.2008 Tiivistelmä Yi on Haskellilla toteutettu tekstieditori, joka on myös laajennettavissa sekä kustomoitavissa Haskellilla. Editori on hyvin modulaarinen; Esimerkiksi näppäinkomennot voi valita Emacsin ja Vi:n vastaavien välillä. Yin dynaamista linkitystä käyttävä rakenne sekä funktionaalinen toteutus mahdollistavat editorin laajentamisen sekä päivittämisen editoria sulkematta. 1 Johdanto Yi on Haskell-kielellä toteutettu tekstieditori, joka on julkaistu avoimen lähdekoodin lisenssillä. Yi:n web-sivujen mukaan tavoitteena on luoda joustava, tehokas ja oikeellinen editorin ydin, joka on dynaamisesti muokattavissa Haskellilla[1]. Kirjoitushetkellä editori on melko keskeneräinen, mutta kehitys on aktiivista. Kirjoittaja on testannut Yi:n versiota 0.3. Yi muistuttaa varsin paljon Emacs-editoria mutta mukana on myös mm. vieditorin näppäinkomennot. Emacsiin nähden Yi:hin suunnitellaan parempaa tukea parsereille ja sitä kautta parempia staattisia koodin analysointityökaluja. Tekijät myös uskovat Haskellin olevan parempi ohjelmointikieli tähän tarkoitukseen kuin Emacsissa käytetty Emacs Lisp.[1] 2 Ominaisuuksia Yi:ssa on monia ominaisuuksia, joita hyvältä tekstieditorilta odottaisi, mm. syntaksin väritys, hakutoiminnot sekä hakemistojen käsittely. Tekstiä käsitellään puskureissa(buffer), joita voi olla auki useita kerrallaan. Käyttöliittymänä on komentopääte tai graafisen käyttöliittymän ikkuna, joka tosin ei nykyisellään tuo juuri mitään lisäarvoa ensiksimainittuun verrattuna. Käyttöliittymä on toteutettu erillisenä dynaamisesti ladattavana modulina. Ohjelman konfigurointi tapahtuu Haskellia kirjoittamalla. Tämä on hyödyllistä, koska asetusten säilyttämiseen ei tarvita erillistä tiedostoformaattia ja koska Haskell on(ainakin minun mielestäni) varsin ilmaisuvoimainen kieli. 1

Käyttäjä voi muuttaa asetuksiaan tekemällä modulin /.yi/yiconfig.hs, jossa konfiguraatio asetetaan yimain-nimisen monadin kautta(monadi on tyyppiä YiM () katso luku 4). Yi:n mukana tulee useita esimerkkejä konfiguraatiotiedoston tekemiseen. 3 Näppäinkomentojenmäärittely Näppäinkomennot määritellään parserifunktioina, jotka lukevat käyttäjän syötettä ja sen perusteella palauttavat Action-muuttujia. Action on synonyymi tyypille IO (). Näppäinmääritykset ovat siten tyyppiä: keymap :: [Char] -> [Action] Tälläinen funktio on käyttökelpoinen Haskellin laiskan laskennan ansiosta. Yi tarjoaa erilaisia operaatioita eri parsereiden yhdistämiseen, joiden ansioista parsereita voidaan määritellä eri tiedostoissa ja niiden yhdistäminen on selkeää ja vaivatonta. Steward ja Chakravarty toteavatkin, että em. operaatiot muodostavat oman kielensä näppäinkomentojen määrittämiseen(embedded domain specific language).[3] Seuraava esimerkki Stewardin ja Chakravartyn paperista [3] määrittelee joitain ee-editorin näppäinkomentoja. Operaattori > < yhdistää kaksi parseria, insert sekä command. insert:in määrityksessä any vastaa mitä tahansa merkkiä, jolle action-operaattorilla määritellään insert-toiminto. Vastaavasti command määritellään siten, että ohjausmerkkejä luettaessa(cmd) valitaan suoritettava toiminto ohjausmerkin perusteella. keymap cs = fst3 $ execlexer lexer (cs, ()) lexer = insert > < command insert = any action \[c] -> Just (inserte c) command = cmd action \[c] -> Just $ case c of \ˆL -> lefte \ˆR -> righte \ˆU -> upe \ˆD -> downe \ˆB -> bote \ˆT -> tope \ˆK -> deletee \ˆY -> kille \ˆH -> deletee >> lefte \ˆG -> sole \ˆO -> eole \ˆX -> quite _ -> undefined 2

4 Tietorakenteet Tekstieditori on ohjelma jonka tila muuttuu varsin tiuhaan, mm. näppäinpainallusten jälkeen. Koska Yi on ohjelmoitu puhtaasti funktionaalisella kielellä, ohjelman tilaa ei varsinaisesti muuteta, vaan välitetään eteenpäin. Niinpä ohjelman tilatieto ei ole hajallaan eri moduleissa, vaan koottuna yhteen tietorakenteeseen, nimeltään Yi, joka karkeasti ottaen on seuraavanlainen(joitain olennaisia osia jätetty pois)[2]: Yi yieditor :: IORef Editor buffers :: M.Map BufferRef FBuffer windows :: WindowSet Window tabwidth ::!Int... yiui :: UI threads :: IORef [ThreadId] input :: Chan Event output :: Chan Action... Tilan muutokset on luonnollisesti toteutettu monadeilla. Kun haluamme muuttaa Yi:tä, Editor:ia tai Bufferia, muutoksia vastaavat monadit ovat: YiM () EditorM () BufferM () 5 Funktioidenmäärittely Käyttäjä voi konfiguraatiotiedostoissaan määritellä funktioita, joilla editorin toimintaa voi muokata mieleisekseen. Tarkastellaan esimerkkinä funktiota, joka asettaa tekstipuskuriin Latex-lohkon: insertlatexblock :: String -> BufferM () insertlatexblock b = do insertn ("\\begin{" ++ b ++ "}\n") savingpointb $ insertn ("\n\\end{" ++ b ++ "}") 3

Funktio on paluuarvoltaan BufferM (), joten se on tekstipuskuria käsittelevä funktio. Parametina on lohkon nimi(esim. verbatim tai enumerate). insertn asettaa tekstiä puskuriin. savingpointb on funktionaali, joka säilyttää kursorin paikan. Toisin sanoen se palauttaa kursorin siihen kohtaan puskuria, missä se ennen parametrina annetun funktion suoritusta oli. Näin kursori jää sinne minne pitääkin, eli begin- ja end-komentojen väliin. Tämä funktio on jo sellaisenaan käytettävissä editorissa, kunhan se on jossakin konfiguraatiomodulissa ja lueteltu modulin rajapinnassa. Funktiota voi käyttää valitsemalla komentokehote(painamalla alt-x) ja kirjoittamalla insertlatexblock. Tällöin Yi kysyy merkkijonovakiota, jonka syöttämällä haluttu lohko asetetaan puskuriin. Käytettävyyttä voitaisiin vielä parantaa seuraavasti: latexblock :: YiM () latexblock = withminibuffer "Lohko:" return (withbuffer. insertlatexblock) Tämä funktio kysyy käyttäjältä lohkon nimeä ja käyttää edellistä funktiota lohkon asettamiseen. withminibuffer ottaa parametreinaan käyttäjälle näytettävän kehotteen, täydennysfunktion sekä funktion, joka ottaa parametrinaan käyttäjän syötteen. Koska withminibuffer on tyyppiä YiM (), asetetaan myös tämän funktion tyypiksi YiM (). Koska withminibuffer-funktion viimeinen parametri on tyyppiä YiM (), sovitetaan insertlatexblock sen tyyppiseksi withbuffer-funktionaalilla. Täydennysfunktio, jonka tyyppi on String -> YiM String, täydentää käyttäjän syötteen tabulaattoria painettaessa. Tässä täydennysfunktiona on return, joten täydennystä ei tapahdu. Parempi tietysti olisi tarjota funktio, joka täydentää Latex-lohkojen nimiä. 6 Dynaaminenlataus Eräs Yi:n mielenkiintoisista ominaisuuksista on mahdollisuus laajentaa tai päivittää editoria sulkematta sitä. Tämä on mahdollista, koska ohjelmalla on pieni (noin sata koodiriviä) staattisesti linkitetty ydin. Staattisen ytimen tehtävänä on moduleiden lataaminen.[3] Kun ohjelma(staattinen ydin) käynnistetään, se lataa konfiguraatiomodulit sekä varsinaisen editorin koodin ja kutsuu tämän main-funktiota, antaen sille parametrina konfiguraation. Myös editorin laajennokset, kuten erilaiset käyttöliittymät tai näppäinasetukset, ladataan dynaamisesti. Editorin uudelleenkonfigurointi tapahtuu pääpiirteissään seuraavasti[3]: 1. reloade-funktiota kutsutaan. 2. reloade kutsuu staattisen ytimen reconf-funktiota. 3. Staattinen ydin kääntää ne konfiguraatiomodulit, joissa on tapahtunut muutoksia. 4

4. Jos oli muutoksia, ladataan muuttuneet modulit ja palautetaan konfiguraatio Just-muodossa. Muuten palautetaan Nothing. Lisäksi täytyy ottaa huomioon mm. tyyppien yhteensopivuus. Staattinen ydin nimittäin palauttaa konfiguraation polymorfisena arvona. Kun halutaan ladata jokin laajennos tai peräti koko editori uudestaan, tilanne on hieman mutkikkaampi. Yi:n puhtaasti funktionaalinen toteutus on tässä oleellista. Staattisen ytimen remain-funktio suorittaa ohjelman uudelleen latauksen seuraavien vaiheiden kautta, jotka on esitetty Stewardin ja Chakravartyn paperissa[3]: 1. Funktiota kutsutaan dynaamisesta koodista parametrinaan ohjelman tilatieto(mukaanlukien luvussa 4 mainittu Yi-tyyppi). 2. Dynaaminen koodi poistetaan ohjelman instanssista. 3. Dynaaminen koodi(mahdollisesti uudempi versio) ladataan. 4. Staattinen ydin kutsuu tiettyä dynaamisen koodin funktiota, jolle annetaan tilatieto parametrina. Staattinen ydin siis välittää tilatiedon uudelle dynaamisen ohjelmaosion instanssille. Näin käyttäjä voi jatkaa editointia siitä mihin hän jäi ennen ohjelman uudelleenlatausta. Aivan näin yksinkertainen uudelleenlatausprosessi ei tietenkään ole. Esimerkiksi, jos joihinkin koostetyyppeihin on uudessa ohjelmaversiossa tullut uusia kenttiä, ei vanhat arvot toimi sellaisenaan uudessa versiossa. Tämä on ratkaistu serialisoimalla tilatieto sopivaan muotoon, jonka lukuvaiheessa mahdolliset uudet kentät täytetään sopivalla oletusarvolla [3]. 7 Yhteenveto Yi on kehitysvaiheessa oleva editori, joka on laajennettavissa ja kustomoitavissa dynaamisesti, editoria sulkematta. Funktio-ohjelmoinnin rakenteet tekevät joidenkin asioiden määrittelystä suoraviivaista, kuten näppäinkomentojen määrittely syötteen parsereita yhdistelemällä. Funktionaalinen toteutus myös käsittelee ohjelman tilaa keskitetysti, mikä tekee editorin päivittämisen ajon aikana kohtuullisen helpoksi. Nykyisellään Yi ei ole kovin helposti lähestyttävä. Aika näyttää, vetoaako Yi suurempaan yleisöön vai jääkö se haskellistien työkaluksi. Viitteet [1] Jean-Philippe Bernardy, Don Stewart ym., Yi, kotisivu URL: http://www.haskell.org/haskellwiki/yi, viitattu 16.4.2008. 5

[2] Jean-Philippe Bernardy, Don Stewart ym., Yi, lähdekoodi, versio 0.3 URL: http://hackage.haskell.org/packages/archive/yi/0.3/yi-0.3.tar.gz, viitattu 21.4.2008. [3] Don Steward, Manuel M. T. Chakravarty, Dynamic Applications From the Ground Up, Programming Languages and Systems, School of Computer Science and Engineering, University of New South Wales, 2005. 6