Yhteinen Lisp | |
---|---|
Semantiikka | moniparadigma : oliosuuntautunut , toiminnallinen , pakottava , metakieli |
Kieliluokka | ohjelmointikieli , prosessiohjelmointikieli , olioohjelmointikieli , toiminnallinen ohjelmointikieli ja moniparadigman ohjelmointikieli |
Toteutustyyppi | koottu |
Esiintyi | 1984 , standardoi ANSI vuonna 1994 |
Tekijä | Komitea X3J13 |
Kehittäjä | X3J13 [d] |
Tyyppijärjestelmä | vahva , dynaaminen , valinnaisilla tyyppimäärityksillä |
Tärkeimmät toteutukset | Allegro Common Lisp , ABCL , CLISP , Clozure CL , CMUCL , Corman Common Lisp , ECL , LispWorks , Scieneer CL , SBCL |
Vaikutettu | Lisp , Lisp Machine Lisp , MacLisp , InterLisp , Scheme |
vaikutti | Clojure , Factor , Dylan , EuLisp , ISLisp , SKILL , Stella , SubL |
Verkkosivusto | common-lisp.net _ |
Mediatiedostot Wikimedia Commonsissa |
Common Lisp (lyhennettynä CL ) on ANSI :n standardoiman Lisp - ohjelmointikielen murre [1] . Se kehitettiin 1980-luvun alussa erilaisten Lisp-murteiden yhdistämiseksi; Useita Common Lisp -toteutuksia on saatavilla, sekä kaupallisia että ilmaisia .
Standardi korjaa kielen moniparadigmaksi : proseduurin , toiminnallisen ja olioohjelmoinnin yhdistelmää tuetaan . Erityisesti olio-ohjelmoinnin tarjoaa kielen CLOS -järjestelmä ; ja Lisp-makrojärjestelmän avulla voit tuoda kieleen uusia syntaktisia rakenteita, käyttää metaohjelmoinnin ja geneerisen ohjelmoinnin tekniikoita .
Murteen kehittäminen aloitettiin vuonna 1981 DARPA -johtajan Bob Engelmoren ehdotuksesta.
Kehitystä koordinoitiin sähköpostitse, ja kielen alkuperäistä rakennetta on muokattu huomattavasti sen edetessä. Ensimmäisen katsauksen standardin kehityksestä esitti Guy Lewis Steele ACM Symposium on Lisp and Functional Programming -tapahtumassa vuonna 1982, ja ensimmäinen asiakirja kielestä julkaistiin vuonna 1984 ("The Common Lisp Language, First Edition"). Toinen painos, joka julkaistiin vuonna 1990, sisälsi monia muutoksia, jotka ANSI teki kieleen standardointiprosessin aikana. Standardin lopullinen versio julkaistiin vuonna 1994.
Vuodesta 2018 lähtien standardiin ei ole julkaistu päivityksiä, ja Common Lispin erilaisia laajennuksia ja parannuksia (kuten Unicode-tuki, samanaikaisuus, CLOS-pohjainen I/O) tarjoavat toteutukset ja kirjastot (monet saatavilla Quicklispin kautta ).
Common Lisp käyttää S-lausekkeita merkitsemään sekä koodia että dataa . Funktiot ja makrokutsut ovat listoja , joissa ensimmäinen elementti eli luettelon pää on funktion nimi ja loput, luettelon "häntä", ovat argumentteja .
( +2 2 ) ; _ lisää 2 ja 2 palauttaen tuloksen 4. ( - 8 3 ) ; vähentää kolme kahdeksasta ja palauttaa tuloksen 5. ( käänteinen "Hei, maailma!" ) ; kääntää merkkijonon ja palauttaa ""!rome ,yuvtswardZ"" ;; muuttujien ja funktioiden määritelmät: ( defvar *x* ) ; Määrittää muuttujan *x* määrittämättä mitään ; arvot. Kaksi tähteä, jotka ovat osa nimeä - hyväksytty ; standardi globaalien muuttujien nimeämiseen. ( setf *x* 42.1 ) ; määrittää liukulukuarvon 42.1 muuttujalle *x*. ( defun square ( x ) ; funktioneliön määrittäminen , joka ottaa yhden argumentin ( * x x )) ; ja palauttaa sen neliön. ( neliö *x* ) ; kutsuu neliöfunktiota välittäen sille arvon *x* ; ja palauttaa neliön (1772.41). ( anna (( a 3 )( b 4 )) ( + a b )) ; Erikoismuoto let luo paikallisia muuttujia, antaa niille arvoja ; (tässä tapauksessa muuttujalle a annetaan arvo 3 ja b - 4), ; sitten laskee ja palauttaa funktion tuloksen ; (tässä tapauksessa 7). Muuttujat ovat paikallisia, joten ; jos yritetään arvioida arvoa (+ ab) let-kappaleen ulkopuolella, seurauksena on virhe.Numerotyyppejä ovat kokonaisluvut , murtoluvut , liukulukuluvut ja kompleksiluvut [2] . Common Lisp mahdollistaa suurten numeroiden käyttämisen edustamaan mitä tahansa määrää tarkemmin.
Common Lisp : n merkit eivät rajoitu ASCII : iin , useimmat nykyaikaiset toteutukset tukevat Unicodea .
Symbolin käsite, jota ei käytännössä käytetä tässä muodossa muissa kielissä, on yksi keskeisistä, se on ainutlaatuinen tietoobjekti, mukaan lukien: nimi, arvo, funktio, ominaisuusluettelo ja paketti (nimiavaruus). Lispin symboleja käytetään usein samalla tavalla kuin muiden kielten tunnisteita : muuttujan arvon tallentamiseen. Niillä on kuitenkin monia muita käyttötarkoituksia. Yleensä kun symbolille annetaan arvo, se palautetaan heille välittömästi. Jotkut symbolit antavat itselleen arvon, esimerkiksi loogiset arvot esitetään kahtena itsemäärittelevänä symbolina Tja NIL.
Skalaarityyppien pyöristämiseen eri tavoilla on useita toimintoja . Funktio roundpyöristää argumentin lähimpään kokonaislukuun ja jos luku on "keskellä", niin lähimpään parilliseen. Funktio truncatepyöristää numerot nollaa kohti. Funktiot floorja ceilingpyöristys lähimpään pienempään ja lähimpään suurempaan numeroon. Kaikki funktiot palauttavat murto-osan toissijaisena tuloksena.
Common Lisp -sovelluksen sekvenssit ovat luetteloita, vektoreita, bittivektoreita ja merkkijonoja. On monia toimintoja, jotka voivat toimia minkä tahansa tyyppisen sekvenssin kanssa.
Kuten lähes kaikki muut Lisp-murteet, Common Lispin luettelot koostuvat pistepareista ( conses ). cons on tietorakenne, jossa on kaksi aikaväliä: carja cdr. Lista on yhdistetty ketju katkovilla pareilla (tai voi olla tyhjä). carjokainen pari viittaa listan elementtiin (mahdollisesti toiseen luetteloon). cdrjokaiseen pariin viittaa seuraava pari, lukuun ottamatta luettelon viimeistä paria, jonka cdrarvo on nil. Pistepareja voidaan myös helposti käyttää puiden ja muiden monimutkaisten tietorakenteiden toteuttamiseen; vaikka yleensä on suositeltavaa käyttää sen sijaan rakenteita tai luokkaesiintymiä. On myös mahdollista luoda pyöreä tietorakenne pistepareilla.
Common Lisp tukee moniulotteisia taulukoita ja voi dynaamisesti muuttaa säädettävien taulukoiden kokoa tarpeen mukaan. Moniulotteisia taulukoita voidaan käyttää matriisilaskelmiin. Vektori on yksiulotteinen taulukko. Taulukot voivat sisältää elementtinä minkä tahansa tyypin (jopa sekoittaa eri tyyppejä samaan taulukkoon) tai ne voivat olla erikoistuneet sisältämään vain tietyn tyypin. Yleensä vain muutamia tyyppejä tuetaan. Monet toteutukset voivat optimoida taulukon toimintoja, kun taulukko on tyyppikohtaista. Tavallisia tyyppikohtaisia taulukoita on kaksi: merkkijono, joka on merkkivektori ( char), ja bittivektori .
Hash-taulukko tallentaa objektien välisen kartoituksen. Mitä tahansa objektia voidaan käyttää avaimena tai arvona. Hash-taulukoiden koko muuttuu automaattisesti tarpeen mukaan.
Paketit ovat symbolikokoelmia, joita käytetään ensisijaisesti erottamaan ohjelman osia nimiavaruiksi . Paketti voi viedä joitain symboleja merkitsemällä ne osaksi julkista käyttöliittymää. Paketit voivat käyttää muita paketteja.
Rakenteet , jotka ovat samankaltaisia kuin C :n rakenteet ja Pascalin tietueet , edustavat mielivaltaisia monimutkaisia tietorakenteita, joissa on mikä tahansa määrä ja tyyppisiä kenttiä (kutsutaan slotiksi ). Rakenteet sallivat yksittäisen periytymisen.
Luokat , jotka ovat osa CLOS - objektijärjestelmää , ovat samankaltaisia kuin rakenteet, mutta ne tarjoavat moninkertaisen perinnön ja dynaamisemman käyttäytymisen. Luokat lisättiin myöhään Common Lispiin, ja ne ovat osittain päällekkäisiä käsitteellisesti. Luokista luotuja objekteja kutsutaan instansseiksi. Erikoistapaus ovat yleiset funktiot, jotka ovat sekä funktioita että ilmentymiä.
Common Lisp tukee ensiluokkaisia toimintoja . Voit esimerkiksi kirjoittaa funktioita, jotka ottavat muita toimintoja argumentteina tai palauttavat funktioita.
Common Lisp -kirjasto on vahvasti riippuvainen tällaisista funktioista. Funktio sortkäyttää esimerkiksi vertailufunktiota ja valinnaisesti avainfunktiota tietorakenteiden lajittelemiseksi avaimen mukaan.
;; Lajittelee luettelon >- ja <-funktioiden avulla. ( sort ( lista 5 2 6 3 1 4 ) #' > ) ; palauttaa (6 5 4 3 2 1) ( lajittele ( lista 5 2 6 3 1 4 ) #' < ) ; palauttaa (1 2 3 4 5 6) ;; Lajittelee luettelon aliluetteloiden ensimmäisten elementtien mukaan. ( sort ( lista ' ( 9 A ) ' ( 3 B ) ' ( 4 C )) #' < :key #' ensin ) ; palauttaa ((3 B) (4 C) (9 A)) Toimintojen määritelmätMakro defunmäärittää funktion. defunhyväksyy funktion nimen, parametrien nimet ja funktion rungon:
( defun square ( x ) ( * x x ))Funktiomääritelmät voivat sisältää kääntäjädirektiivejä , jotka tunnetaan nimellä eng. ilmoitukset , jotka antavat kääntäjälle vihjeitä optimoinneista tai argumenttityypeistä. Voidaan myös lisätä dokumentaatiomerkkijonoja ( docstrings ) , joita Lisp voi käyttää dokumentaation toimittamiseen:
( defun square ( x ) "Laskee yhden kelluvan x:n neliön." ( julisti ( single-float x ) ( optimoi ( nopeus 3 ) ( debug 0 ) ( safety 1 ))) ( yhden kellunta ( * x ) x )))Anonyymit funktiot määritellään lambdaesimerkiksi (lambda (x) (* x x)) neliöintifunktiolla. Lisp-tyyliin ohjelmointi liittyy usein korkeamman asteen funktioiden käyttöä, joille on kätevää välittää anonyymejä toimintoja argumenteiksi.
Paikalliset funktiot voidaan ilmoittaa painikkeilla fletja labels.
( tasainen (( neliö ( x ) ( * x x ))) ( neliö 3 ))On olemassa useita muita funktioiden määrittelyyn ja manipulointiin liittyviä operaattoreita. Esimerkiksi funktioita voidaan kääntää compileoperaattorilla. (Jotkut Lisp-järjestelmät suorittavat toimintoja käyttämällä oletustulkkia, ellei kääntämistä ole määritetty; toiset kääntävät jokaisen funktion).
Common Lisp eroaa kielistä kuten C# , Java , Perl ja Python siinä, että sen määrittelee oma standardinsa, eikä sille ole olemassa yksittäistä tai kanonista toteutusta. Kuka tahansa voi lukea standardin ja luoda oman toteutuksensa. Common Lisp tunnistaa nämä tyypit automaattisesti samanarvoisiksi. [3]
Nimi | Tuetut alustat | Kokoaminen | Ominaisuudet | Lisenssi |
---|---|---|---|---|
CLISP [6] | Windows , Mac , *nix | Tavukoodi , JIT | Lisp-järjestelmän pieni kuvakoko. Erittäin tehokas pitkän kokonaisluvun aritmetiikka. Mahdollisuus luoda suoritettavia tiedostoja. FFI (rajapinta matalan tason funktioiden kutsumiseen (funktiot C-kielellä kirjoitetuista kirjastoista jne.) ja "hallitsemattoman" muistin kanssa toimimiseen. Takaisinsoittotoiminnot (integraatio "natiiviin" alustakoodiin). | GNU GPL |
CMUCL [7] | Linux , FreeBSD , Solaris , Darwin | Tavukoodi, konekoodi | Laadukas kääntäjä konekoodiksi. FFI. Takaisinsoittotoiminnot (integraatio "natiiviin" alustakoodiin). | Julkinen ja osat BSD-lisenssillä |
ECL | Windows, *nix, Mac OS X | Tavukoodi, konekoodi C :n kautta | Hyvä integrointi C-ohjelmien ja suoraan suoritettavan alustakoodin kanssa (FFI, takaisinsoittotoiminnot, kyky luoda dynaamisia ja staattisia binaarisia kirjastoja). Mahdollisuus luoda suoritettavia tiedostoja. Monisäikeisyys kaikilla tuetuilla alustoilla. | GNU GPL ja muiden lisenssien alaisia osia |
Clozure CL (entinen OpenMCL) [8] | Linux/PPC, Linux/X86-64, Darwin/PPC, Darwin/X86-64, FreeBSD/X86-64, Windows | konekoodi | Nopea kääntäjä. Tehokas ja kätevä FFI. Takaisinsoittotoiminnot (integrointi alustan binaarikoodiin). Mahdollisuus luoda suoritettavia tiedostoja. Monisäikeisyys kaikilla tuetuilla alustoilla. | LGPL |
SBCL [9] | Linux, BSD , Solaris, Mac OS X (Darwin), Windows (kokeellinen) | konekoodi | Edistyksellinen kääntäjä konekoodiksi. Mahdollisuus luoda suoritettavia tiedostoja. FFI. Takaisinsoittotoiminnot (integrointi alustan binaarikoodiin). Monisäikeisyys Linuxissa, Solaris 10:ssä ja Mac OS X:ssä. | Julkinen, MIT-lisenssin ja BSD-lisenssin alaisia osia |
ABCL [10] | JVM | JVM -tavukoodi | Käyttöliittymä Java-alustalle. Monisäikeinen. Alustan riippumattomuus. | LGPL |
Allegro Common Lisp [11] | Windows, Unix , Linux, Mac OS X | konekoodi | Kaupallinen, rajoitettu demo saatavilla | |
LispWorks [12] | Windows, *nix, Mac OS X | konekoodi | Kehitetty IDE. CAPI on kirjasto käyttöliittymän luomiseen. Hyvä integrointi C-ohjelmiin ja "natiiviin" alustakoodiin (FFI, takaisinsoittotoiminnot, kyky luoda alkuperäisiä dynaamisia ja staattisia kirjastoja alustalle). Mahdollisuus luoda suoritettavia tiedostoja. Monisäikeisyys kaikilla tuetuilla alustoilla. | Kaupallinen, rajoitettu demo saatavilla |
Corman Common Lisp | Windows | konekoodi | Vuodesta 2015 lähtien - MIT-lisenssi . Jaettu alun perin Shareware-muodossa, järjestelmän lähdekoodilla (pois lukien IDE) |
Yhteinen Lisp | |||||||
---|---|---|---|---|---|---|---|
Toteutukset |
| ||||||
Ohjelmisto |
| ||||||
Julkaisut |
| ||||||
suunnittelutoimikunta |
| ||||||
muu |
|
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ominaisuudet |
| ||||||||||||||
Toteutukset |
| ||||||||||||||
Laitteisto |
| ||||||||||||||
Yhteisö |
| ||||||||||||||
|
Ohjelmointikielet | |
---|---|
|