Yhteinen Lisp-objektijärjestelmä - Common Lisp Object System
Common Lisp Object System (CLOS) on järjestely olio-ohjelmointi , joka on osa ANSI Common Lisp . CLOS on tehokas dynaaminen objektijärjestelmä, joka eroaa radikaalisti staattisemmilla kielillä , kuten C ++ tai Java, olevista OOP-palveluista . CLOS on saanut inspiraationsa aikaisemmista Lisp-objektijärjestelmistä, kuten MIT Flavours ja CommonLoops , vaikka se onkin yleisempää kuin kumpikaan. Alun perin lisäosana ehdotettu CLOS hyväksyttiin osana ANSI-standardia Common Lisp: lle ja sitä on mukautettu muihin Lisp-murteisiin, kuten EuLisp tai Emacs Lisp .
ominaisuudet
CLOS: n peruselementit ovat menetelmät , luokat , näiden luokkien esiintymät ja yleiset toiminnot . CLOS tarjoaa makroja määritellä ne: defclass, defmethodja defgeneric. Ilmentymiä luodaan menetelmällä make-instance.
Luokat voivat sisältää useita yläluokkia , luettelon paikoista (jäsenmuuttujat C ++ / Java-kielessä) ja erityisen metaklassin . Paikat voidaan jakaa luokittain (kaikki luokan esiintymät jakavat paikan) tai esiintymittäin. Jokaisella korttipaikalla on nimi ja korttipaikan arvoon pääsee tällä nimellä toiminnon avulla slot-value. Lisäksi voidaan määrittää erityisiä yleisiä toimintoja aikavälien arvojen kirjoittamiseen tai lukemiseen. Jokaisella CLOS-luokan slotilla on oltava yksilöllinen nimi.
CLOS on moninkertainen lähettämistä järjestelmä. Tämä tarkoittaa, että menetelmät voidaan erikoistua mihin tahansa tai kaikkiin vaadittuihin argumentteihin. Suurin osa OO-kielistä on yksi lähetys, mikä tarkoittaa, että menetelmät ovat erikoistuneet vain ensimmäiseen argumenttiin. Toinen epätavallinen piirre on, että menetelmät eivät "kuulu" luokkiin; luokat eivät tarjoa nimitilaa yleisille toiminnoille tai menetelmille. Menetelmät määritellään luokista erillään, eikä niillä ole erityistä pääsyä (esim. "Tämä", "itse" tai "suojattu") luokkapaikkoihin.
CLOS: n menetelmät on ryhmitelty yleisiin toimintoihin . Yleinen funktio on objekti, joka voidaan kutsua kuten funktio ja joka yhdistää joukon menetelmiä jaettuun nimeen ja argumenttirakenteeseen, joista jokainen on erikoistunut erilaisiin argumentteihin. Koska Common Lisp tarjoaa ei-CLOS-luokat rakenteille ja sisäänrakennetuille tietotyypeille (numerot, merkkijonot, merkit, symbolit, ...), CLOS-lähetys toimii myös näiden ei-CLOS-luokkien kanssa. CLOS tukee myös yksittäisten objektien lähettämistä (eql-asiantuntijat). CLOS ei oletusarvoisesti tue kaikkien Common Lisp -tietotyyppien lähettämistä (esimerkiksi lähetys ei toimi täysin erikoistuneille taulukkotyypeille tai käyttöönotetuille tyypeille deftype). Useimmat tavalliset Lisp-toteutukset tarjoavat kuitenkin metaobjektiprotokollan, joka sallii yleisten toimintojen tarjota sovelluskohtaiset erikoistumis- ja lähetyssäännöt .
Lähetys CLOS: ssa on myös erilainen kuin useimmat OO-kielet:
- Annetaan luettelo argumenteista, määritetään luettelo sovellettavista menetelmistä.
- Tämä luettelo on lajiteltu niiden parametriasiantuntijoiden spesifisyyden mukaan.
- Tästä luettelosta valitut menetelmät yhdistetään sitten tehokkaaksi menetelmäksi käyttämällä yleisen funktion käyttämää menetelmäyhdistelmää.
- Tehokasta menetelmää kutsutaan sitten alkuperäisillä argumenteilla.
Tämä lähetysmekanismi toimii ajon aikana. Menetelmien lisääminen tai poistaminen voi siten johtaa muutettuihin tehokkaisiin menetelmiin (vaikka yleinen funktio kutsutaan samoilla argumenteilla) ajon aikana. Menetelmäyhdistelmän muuttaminen voi myös johtaa erilaisiin tehokkaisiin menetelmiin.
Esimerkiksi,
; declare the common argument structure prototype
(defgeneric f (x y))
; define an implementation for (f integer t), where t matches all types
(defmethod f ((x integer) y) 1)
(f 1 2.0) => 1
; define an implementation for (f integer real)
(defmethod f ((x integer) (y real)) 2)
(f 1 2.0) => 2 ; dispatch changed at runtime
Kuten useimpien dynaamisten kielten OO-järjestelmät , CLOS ei pakota kapselointia . Mihin tahansa korttipaikkaan pääsee käyttämällä slot-valuetoimintoa tai (valinnaisesti automaattisesti luodut) accessor-menetelmät . Pääset siihen kautta slot-valuesinun on tiedettävä lähtöpaikan nimi. CL-ohjelmoijat ilmoittavat kielen pakettitoiminnolla ilmoittaakseen, mitkä toiminnot tai tietorakenteet on tarkoitettu vietäviksi.
Lukuun ottamatta normaalia ( "primaarinen") menetelmillä, on myös olemassa :before, :afterja :around"ylimääräiset" menetelmiä. Kaksi edellistä käytetään ennen ensisijaista menetelmää tai sen jälkeen tietyssä järjestyksessä luokan hierarkian perusteella. :aroundMenetelmällä voidaan säädellä, onko ensisijainen menetelmä suoritetaan lainkaan. Lisäksi ohjelmoija voi määritellä, pitäisikö kutsua kaikkia mahdollisia ensisijaisia menetelmiä luokkahierarkiassa tai vain lähimmän vastaavuuden.
Standard Method-yhdistelmä tarjoaa ensisijaisen, ennen, jälkeen ja noin menetelmiä edellä on selitetty. On olemassa muita menetelmäyhdistelmiä muiden menetelmätyyppien kanssa. Uudet (sekä yksinkertaiset että monimutkaiset) menetelmäyhdistelmät ja menetelmätyypit voidaan määritellä.
CLOS sallii useiden perintöjen . Kun oletusjärjestys, jossa menetelmät suoritetaan useissa perinnöissä, ei ole oikea, ohjelmoija voi ratkaista timantin perintöongelmat määrittelemällä menetelmäyhdistelmien järjestyksen.
CLOS on dynaaminen, mikä tarkoittaa, että sisällön lisäksi myös objektien rakennetta voidaan muokata ajon aikana. CLOS tukee luokkamääritysten muuttamista lennossa (vaikka kyseessä olevan luokan instansseja on jo olemassa) sekä tietyn instanssin luokan jäsenyyden muuttamista change-classoperaattorin kautta . CLOS mahdollistaa myös menetelmien lisäämisen, määrittelemisen ja poistamisen ajon aikana. Circle-ellipsi Ongelma on helposti ratkaista CLOS, ja useimmat OOP suunnittelu kaavoja joko katoaa tai laadullisesti yksinkertaisempia.
CLOS ei ole prototyyppikieli : luokat on määriteltävä, ennen kuin objektit voidaan instantisoida luokan jäseninä.
Metaobject-protokolla
ANSI Common Lisp -standardin ulkopuolella CLOS: iin on laajasti toteutettu laajennus nimeltä Metaobject Protocol (MOP). MOP määrittelee standardiliitännän CLOS-toteutuksen taustalla, käsittelemällä luokkia, aikavälikuvauksia, yleisiä toimintoja ja menetelmiä itse metasluokkien esiintyminä ja sallien uusien metaluokkien määrittelyn ja CLOS-käyttäytymisen muokkaamisen. CLOS MOP: n joustavuus ennakoi näkökulmiin suuntautuneen ohjelmoinnin , jonka myöhemmin kehittivät jotkut samat insinöörit, kuten Gregor Kiczales . MOP määrittelee koko objektijärjestelmän käyttäytymisen protokollasarjalla. Nämä määritellään CLOS-termeillä. Siten on mahdollista luoda uusia objektijärjestelmiä laajentamalla tai muuttamalla tarjottua CLOS-toiminnallisuutta. The Art of the Metaobject Protocol -kirjassa kuvataan CLOS MOP: n käyttöä ja toteutusta.
Eri Common Lisp -toteutuksilla on hieman erilainen tuki Meta-Object-protokollalle. Lähempänä Projekti pyrkii tarjoamaan puuttuvat ominaisuudet.
Vaikutukset vanhemmista Lisp-pohjaisista objektijärjestelmistä
Flavours (ja sen seuraaja New Flavours) oli MIT Lisp-koneen objektijärjestelmä . Suuri osa Lisp Machine -käyttöjärjestelmistä ja monet sen sovellukset käyttävät makuja tai uusia makuja. Flavours otti käyttöön useita perintöominaisuuksia ja sekoituksia muun muassa. Makut ovat enimmäkseen vanhentuneita, vaikka Common Lisp -toteutuksia onkin olemassa. Flavours käytti viestin välittämisen paradigmaa. Uudet makut esittivät yleisiä toimintoja.
CommonLoops oli LOOPSin seuraaja (Xerox Interlisp -D: ltä ). CommonLoops otettiin käyttöön Common Lisp -ohjelmaa varten. Kannettava toteutus nimeltä Portable CommonLoops (PCL) oli ensimmäinen CLOS-toteutus. PCL on laajasti siirretty ja tarjoaa edelleen perustan useiden Common Lisp -toteutusten CLOS- toteutukselle. PCL on toteutettu enimmäkseen kannettavassa Common Lisp -ohjelmassa, jossa on vain muutama järjestelmästä riippuva osa.
CLOS muilla ohjelmointikielillä
CLOS: n voiman ja ilmeikkyyden sekä TinyCLOS: n ( Gregor Kiczalesin kirjoittaman yksinkertaistetun kannettavan CLOS-toteutuksen Scheme-käyttöön) historiallisen saatavuuden vuoksi CLOS: n kaltaisista MOP-pohjaisista objektijärjestelmistä on tullut tosiasiallinen normi useimmissa Lisp-ohjelmissa. murteen toteutukset sekä tien löytäminen joidenkin muiden kielten OOP- palveluihin:
- COS, C-objektijärjestelmä
- Dylan
- Dynace, (suurelta osin) CLOS-toteutus C: ssä
- EIEIO Emacs Lispille
- Gauche , kaavio CLOS: n kanssa
- GOOPS in GNU Guile
- ILOS ISLISP: ssä
- Meroon , objektijärjestelmä järjestelmässä
- Jousimies , järjestelmä CLOS: n kanssa
- ScmObj , järjestelmälle
- SOS MIT-järjestelmälle
- STklos , järjestelmä, jossa on CLOS
- Huijata mailassa
- COOPS in Chicken Scheme
- VCLOS taitoa varten
- Tiny-CLOS
Viitteet
- " CommonLoops: yhdistämällä Lisp ja olio-ohjelmointi ", kirjoittanut Daniel G. Bobrow, Kenneth Kahn, Gregor Kiczales, Larry Masinter, Mark Stefik, Frank Zdybel. 1986, Portland, Oregon, Yhdysvallat. Objektisuuntautuneiden ohjelmointijärjestelmien kielet ja sovellukset -konferenssin sivut 17–29 , ISSN 0362-1340.
- "A History and Description of CLOS", kirjoittanut Jim Veitch. Ohjelmakielien käsikirjan sivut 107–158 , osa IV: Toiminnalliset ja loogiset ohjelmointikielet , toim. Peter H.Salus . 1998 (1. painos), Macmillan Technical Publishing; ISBN 1-57870-011-6
Kirjallisuus
- Sonya Keene , Kohdeorientoitu ohjelmointi yhteisessä Lisp: A Programmer's Guide to CLOS , 1988, Addison-Wesley. ISBN 0-201-17589-4
- Gregor Kiczales , Jim des Rivieres ja Daniel G.Bobrow , The Art of the Metaobject Protocol , 1991, MIT Press. ISBN 0-262-61074-4
- Jo A.Lowless ja Molly M.Miller , Understanding CLOS: Common Lisp Object System , 1991, Digital Press, ISBN 1-55558-064-5
- Andreas Paepcke , olio-ohjelmointi: CLOS-näkökulma , 1993, The MIT Press. ISBN 0-262-16136-2
- Yhteinen Lisp- objektijärjestelmä : Richard P. Gabrielin ja Linda DeMichielin yleiskatsaus antaa hyvän johdannon motivaatioon luokkien määrittelemiseen yleisten toimintojen avulla.
- Nick Levinen CLOSin perusteet tarjoaa vaiheittaisen altistumisen OO-konseptien toteuttamiselle CLOS: ssa ja niiden hyödyntämiselle. Se on tarkoitettu kaikille, joilla on perustiedot Lisp: stä tai järjestelmästä.
- Yleinen Lisp HyperSpec , luku 7: Objektit