Yhteinen Lisp

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 .

Historia

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 ).

Syntaksi

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.

Tietotyypit

Skalaarityypit

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.

Tietorakenteet

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ä.

Toiminnot

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ät

Makro 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).

Toteutukset

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]

Tärkeimpien toteutusten vertailutaulukko [4] [5]
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)

Muistiinpanot

  1. ANSI INCITS 226-1994 (R2004) , entinen X3.226-1994 (R1999)
  2. Common Lispin ominaisuudet Arkistoitu 26. joulukuuta 2009.
  3. Lisp on ohjelmoitava ohjelmointikieli. . Haettu 24. huhtikuuta 2010. Arkistoitu alkuperäisestä 12. syyskuuta 2009.
  4. Luettelo tärkeimmistä Common Lisp -toteutuksista . Haettu 15. toukokuuta 2007. Arkistoitu alkuperäisestä 1. toukokuuta 2007.
  5. Lisp Implementations arkistoitu 4. heinäkuuta 2008.
  6. [ GNU CLISP  ] . . Haettu 24. huhtikuuta 2010. Arkistoitu alkuperäisestä 16. maaliskuuta 2010. GNU CLISP  . ]
  7. CMUCL . Haettu 15. toukokuuta 2007. Arkistoitu alkuperäisestä 30. lokakuuta 2005.
  8. Clozure C.L. Haettu 10. kesäkuuta 2008. Arkistoitu alkuperäisestä 5. maaliskuuta 2018.
  9. [ Steel Bank Common Lisp  ] . Haettu 24. huhtikuuta 2010. Arkistoitu alkuperäisestä 6. kesäkuuta 2004. Steel Bank Common  Lisp
  10. Armed Bear Common Lisp (downlink) . Haettu 10. kesäkuuta 2008. Arkistoitu alkuperäisestä 29. maaliskuuta 2007. 
  11. [ Allegro CL - kehittäjä Franz Inc. (englanniksi) . Haettu 24. huhtikuuta 2010. Arkistoitu alkuperäisestä 18. kesäkuuta 2020. Allegro CL on Franz Inc:n kehittäjä. (englanniksi) ]
  12. LispWorks arkistoitu 2. kesäkuuta 2007 Wayback Machinessa . Kehittäjä – LispWorks, LLC (aiemmin Xanalys, Inc.)

Linkit