Common Lisp Object System

Samankaltaiset tiedostot
Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Scheme-kesäkurssi luento 6

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Haskell ohjelmointikielen tyyppijärjestelmä

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

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

815338A Ohjelmointikielten periaatteet

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

16. Javan omat luokat 16.1

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

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

9. Periytyminen Javassa 9.1

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

15. Ohjelmoinnin tekniikkaa 15.1

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

TIE Principles of Programming Languages CEYLON

12. Monimuotoisuus 12.1

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

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

9. Periytyminen Javassa 9.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Javan perusteita. Janne Käki

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

2. Olio-ohjelmoinnin perusteita 2.1

Ohjelmoinnin jatkokurssi, kurssikoe

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

1. Olio-ohjelmointi 1.1

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet

7/20: Paketti kasassa ensimmäistä kertaa

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

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Ohjelmoinnin peruskurssien laaja oppimäärä

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmoinnin peruskurssien laaja oppimäärä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

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

Java kahdessa tunnissa. Jyry Suvilehto

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

UML-kielen formalisointi Object-Z:lla

12 Mallit (Templates)

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

12. Monimuotoisuus 12.1

Mitä on periytyminen?

Perintä (inheritance)

4. Luokan testaus ja käyttö olion kautta 4.1

Java-kielen perusteet

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmoinnin peruskurssien laaja oppimäärä

7. Oliot ja viitteet 7.1

TIES542 kevät 2009 Oliokielten erityispiirteitä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

4. Olio-ohjelmoinista lyhyesti 4.1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Clojure, funktionaalinen Lisp murre

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

11/20: Konepelti auki

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

SEMINAARI ESSEE: DYLAN. TIE Principles of Programming Languages

Muusta kuin vesisioista

Ohjelmoinnin peruskurssien laaja oppimäärä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Mathematica Sekalaista asiaa

Ohjelmoinnin perusteet Y Python

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Transkriptio:

Common Lisp Object System Seminaarityö Tomi Vihtari Ohjelmointikielten periaatteet kevät 2004 Helsingin Yliopisto Tietojenkäsittelytieteen laitos Järvenpää 5. huhtikuuta 2004

Sisältö 1 Johdanto... 1 2 Luokat ja perintä... 1 3 Geneeriset funktiot... 3 4 Metaluokat... 5 5 Luokkien ja ilmentymien uudelleenmäärittely... 5 6 Yhteenveto... 6 Viitteet... 8

1 Johdanto Lisp-kieli kehitettiin 1950- ja 1960-lukujen vaihteessa aluksi listojen prosessointiin, mutta siitä kasvoi yleiskäyttöinen dynaamisesti tyypitetty funktionaalinen ohjelmointikieli [YuH86]. Common Lisp on eräs Lisp-kielen versio, jonka joukko tutkijoita kehitti halutessaan luoda Lispille standardisoidun kielen määrittelyn. 1980- luvulla oliokielet alkoivat vähitellen tehdä läpimurtoa ja myös Lispille alettiin kehitellä omaa olio laajennusta. Common Lispille luotiin 1980-luvun lopussa oliolaajennus CLOS (Common Lisp Object System) [Bob88]. CLOS perustuu geneerisiin funktioihin, moniperintään, deklaratiiviseen metodien yhdistelyyn (declarative method combination) ja meta-olio protokollaan (meta-object protocol). CLOSin perusrakenteita ovat luokat, ilmentymät, geneeriset funktiot ja metodit. Ohjelmointikielenä CLOS perii kaikki Common Lispin ominaisuudet. CLOS on dynaamisesti tyypitetty funktionaalinen kieli joka sisältää roskien keruun ja tehokkaat välineet luokkien, operaatioiden ja jopa kielen itsensä uudelleenmäärittelyyn. 2 Luokat ja perintä Luokka määrittelee luokan ilmentymien rakenteen ja käyttäytymisen [Bob88]. Jokainen Common Lispin olio on jonkin luokan ilmentymä. Olion luokka määrittelee ne operaatiot, jotka voidaan oliolle suorittaa. Luokka määritellään CLOSissa defclassmakron avulla. Määrittely sisältää luokan nimen, listan luokan välittömistä yliluokista, luokan jäsenien määrittelyn (slot specifiers) ja luokan optiot (class options). CLOSissa luokan muuttujia kutsutaan englanninkielisellä termillä slot, joista käytän tässä tekstissä nimitystä jäsen. Jäsenistä jokainen voi sisältää yhden arvon. Luokalla voi olla nolla tai useampi jäsentä. Jäsenet voivat olla joko lokaaleja tai jaettuja. Lokaalit jäsenet näkyvät 1

vain yhdelle luokan ilmentymälle ja jaetut jäsenet ovat yhteisiä kaikkien luokan ilmentymien kesken. Luokkia voidaan määritellä defclass-makron avulla seuraavanlaisesti: > (defclass C1 () ((S1 :initform 5.4 :type number) (S2 :allocation :class))) > (defclass C2 (C1) ((S1 :initform 5 :type integer) (S2 :allocation :instance) (S3 :accessor C2-S3))) Luokan C1 ilmentymillä on lokaali jäsen nimeltä S1, jonka oletusarvo on 5.4 ja jonka arvo pitää olla aina numeeristä tyyppiä. Luokalla C1 on myös jaettu jäsen S2. Luokka C2 on luokan C1 aliluokka. Luokan C2 ilmentymillä on lokaali jäsen S1, jonka oletusarvo on 5 ja jonka arvo on integer-tyyppiä. C2:n ilmentymillä on myös lokaalit jäsen S2 ja S3. C2:lla on metodi C2-S3, jolla luetaan jäsenen S3 arvo, kirjoittamista varten on metodi (setf C2-S3). Luokan ilmentymä luodaan make-instance makron avulla: > (setf my_c2 (make-instance C2)) Tällä komennolla luokasta C2 luodaan ilmentymä my_c2, jonka jäsen S1 saa arvokseen 5, mutta jäseniä S2 ja S3 ei ole sidottu mihinkään arvoon. CLOSin luokat voivat siis periä rakenteet ja käyttäytymisen toisesta luokasta. CLOS mahdollistaa moniperinnän, eli yksittäinen luokka voi periä ominaisuuksia monelta luokalta. Jokaisella luokalla on perintälista (class precedence list), joka sisältää luokan kaikki yliluokat läheisimmästä kaukaisimpaan [Bob88]. Läheisimmät luokat voivat 2

peittää tai ohittaa kaukaisempien luokkien ominaisuuksia. Perintälistan avulla järjestelmä päättää, mitkä ominaisuudet jäävät aliluokassa voimaan [LAM90]. Kuvassa 1 on esitetty eräs luokkahierarkia, jossa C1...C6 ovat luokkia ja aliluokista on vedetty nuolet yliluokkiin. Luokan C6 perintälista on (C6 C4 C5 C3 C1). Luokka C6 on määritelty seuraavasti: (defclass C6 (C4 C5) ()). Koska C4 on mainittu yliluokkien listassa ennen C5:ttä, on se perintälistassa myös ennen C5:ttä. Kuva 1: Esimerkki luokkahierarkiasta 3 Geneeriset funktiot Geneeristen funktiot ovat funktioita, joiden toiminta riippuu niille annettujen parametrien tyypistä [Bob88]. Geneerisen funktion määrittävä objekti sisältää joukon metodeja (sekä myös lambda-listan, metodiyhditelmätyypin (method combination type) sekä muuta tietoa). Metodit määrittävät luokkakohtaisen käyttäytymisen ja geneerisen funktion toiminnan. Kun geneeristä funktiota kutsutaan, se ajaa sille määritellyistä metodeista sen osajoukon, joka määräytyy funktiolle annettujen parametrien luokkien mukaan. 3

Geneeristä funktiota voidaan käyttää samalla tavoin, kuin tavallistakin Common Lispin funktiota. Se voidaan välittää parametrinä ja sille voidaan antaa globaali tai paikallinen nimi [GWB91]. Metodi-objektit sisältävät metodin toiminnan ja sarjan parametrien spesialisoijia (parameter specializers), jotka määrittävät ne tilanteet, joissa metodia voidaan käyttää [Bob88]. Metodi-objektit sisältävät myös sarjan määreitä (qualifiers), joilla metodiyhdistelmiä (method combination) tehtäessä voidaan eri metodit erottaa toisistaan. Jokaisella metodin vaatimalla formaalilla parametrilla on parametrispesialisoija (parameter spesializer) ja metodia kutsutaan ainoastaan, jos parametrit vastaavat parametrispesialisoijien vaatimuksia. Metodien yhdistelijä (method combination facility) valitsee ajettavat metodit, metodien suoritusjärjestyksen ja geneerisen funktion palauttamat arvot. CLOS sisältää oletusarvoisen metodiyhditelmätyypin ja sallii uusien metodiyhdistelmätyyppien määrittelemisen. Geneerinen funktio, joka laskee luvun kertoman voidaan luoda esimerkiksi näin: > (defgeneric fact (n) (:method ((n integer)) (if (< n 2) 1 (* n (fact (1- n))))) (:method ((n string)) (concatenate string n! )) (:documentation Computes the factorial of a number )) Kun funktiota kutsutaan numeroarvolla 4 se palauttaa 24: > (fact 4) 24 Kun funktiota kutsutaan merkkijonoarvolla 4 se palauttaa 4! : > (fact 4 ) 4! 4

4 Metaluokat CLOSissa oliot määritellään luokkien avulla [LAM90]. Myös jokainen luokka on itsessään olio, sen metaluokan ilmentymä. Esimerkiksi kaikki defclass-makron avulla luodut luokat ovat standard-object luokan ilmentymiä. CLOSin toteutusta on mahdollista laajentaa tai muuttaa määrittelemällä uusia metaluokkia tai kirjoittamalla metodeja, jotka ohittavat metaluokkien oletusarvoisen käyttäytymisen. CLOSissa on joukko ennaltamääriteltyjä metaluokkia, joita kutsutaan standardeiksi metaluokiksi. Kuvassa 2 on osajoukko standardien metaluokkien hierarkiasta. Kaikki luokat ja samalla myös metaluokat perivät luokan t. Kaikki metaluokat ovat luokan class aliluokkia. Kuva 2: Standardeja metaluokkia 5 Luokkien ja ilmentymien uudelleenmäärittely Sellainen luokka, joka on standard-class -luokan ilmentymä, voidaan määritellä uudelleen, jos uusi luokka on myös standard-class -luokan ilmentymä [Bob88]. Luokan uudelleenmäärittely muuttaa jo olemassaolevaa luokka-oliota ja ei luo uutta luokka-oliota luokalle. 5

Kun luokka määritellään uudelleen, muutokset leviävät luokan ilmentymiin ja kaikkien luokan aliluokkien ilmentymiin. Ilmentymien päivitysajankohta on toteutuksesta riippuvainen, mutta päivitys tehdään kuitenkin ennen kuin ilmentymän jäseniä luetaan tai kirjoitetaan. Ilmentymän identiteetti ei myöskään muutu, kun se päivitetään. Luokan uudelleenmäärittely saattaa aiheuttaa sen, että luokkaan lisätään tai luokasta poistetaan jäseniä. Päivitysoperaatio muuttaa tällöin ilmentymän jäseniä, mutta se ei luo uutta ilmentymää. CLOSissa on mahdollista muuttaa ilmentymän luokkaa geneerisen change-class -funktion avulla ohjelman kehityksen tai suorituksen aikana. Tämä operaatio toimii samoin, kuin luokan uudelleenmäärittelykin, mutta erona on siis se, että muutos tehdään vain yhteen ilmentymään. Jos vanhalla ja uudella luokalla on saman nimisiä ja tyyppisiä jäseniä, niiden arvo säilyy. Kaikki muut vanhan luokan jäsenet poistetaan ja uusille jäsenille tehdään normaalit alustusoperaatiot. 6 Yhteenveto CLOSia voidaan kutsua funktionaaliseksi oliokieleksi, mutta Common Lispin tavoin CLOS on kaukana puhtaasti funktionaalisista kielistä, koska se sallii muun muassa funktioiden sivuvaikutukset. Myöskin olio-ohjelmointi on tyypillisesti luonteeltaan imperatiivista, koska siinä tavallisesti luodaan oliota, joiden tila muuttuu ohjelman suorituksen aikana. CLOSissa on oliokielenä myös joitain puutteita. Tiedon näkyvyyttä ei voi säädellä ja operaatiot määritellään luokan ulkopuolella. Dynaaminen tyypitys aiheuttaa sen, että tyyppivirheet huomataan vasta ohjelman suorituksen aikana, jos silloinkaan. Puutteistaan huolimatta CLOS tarjoaa jotain, mitä monet muut olio-kielet eivät tarjoa. CLOS on erittäin dynaaminen kaiken suhteen ja kesken ohjelman suorituksen voi tehdä mitä vain. Luokan määritelmää voidaan muuttaa, jolloin muutos heijastuu kaikkiin 6

luokasta tehtyihin ilmentymiin. Myös ilmentymän luokkaa voidaan muuttaa, jolloin CLOS tekee parhaansa sovittaakseen ilmentymän uuteen luokkaan. CLOSilla on siis jopa mahdollista määritellä koko kieli uudelleen kesken ohjelman suorituksen. 7

Viitteet [YuH86] [Bob88] [LAM90] [GWB91] Yuasa, T., Hagiya, M., Introduction to Common Lisp, Academic Press, Inc., 1986 Bobrow, D. et al., Common Lisp Object System specification, ACM SIGPLAN Notices, Volume 23, Issue SI (September 1988), 1-142 Lawless, J., Miller, M., Understanding CLOS The Common Lisp Object System, Digital Press, 1991 Gabriel, R., White, J., Bobrow, D., CLOS: integrating object-oriented and functional programming, Communications of the ACM, Volume 34 Issue 9, September 1991, 29-38 8