Vanlig Lisp | |
---|---|
Semantik | multiparadigm : objektorienterad , funktionell , imperativ , metaspråk |
Språkklass | programmeringsspråk , procedurspråk , objektorienterat programmeringsspråk , funktionellt programmeringsspråk och multiparadigm programmeringsspråk |
Utförandetyp | sammanställt |
Framträdde i | 1984 , standardiserad av ANSI 1994 |
Författare | Kommitté X3J13 |
Utvecklaren | X3J13 [d] |
Typ system | stark , dynamisk , med valfria typdeklarationer |
Stora implementeringar | Allegro Common Lisp , ABCL , CLISP , Clozure CL , CMUCL , Corman Common Lisp , ECL , LispWorks , Scieneer CL , SBCL |
Blivit påverkad | Lisp , Lisp Machine Lisp , MacLisp , InterLisp , Scheme |
påverkas | Clojure , Factor , Dylan , EuLisp , ISLisp , SKILL , Stella , SubL |
Hemsida | common-lisp.net _ |
Mediafiler på Wikimedia Commons |
Common Lisp (förkortat CL ) är en dialekt av programmeringsspråket Lisp standardiserat av ANSI [1] . Det utvecklades med syftet att förena de disparata Lisp-dialekterna vid tiden för det tidiga 1980-talet; Flera implementeringar av Common Lisp är tillgängliga, både kommersiella och gratis .
Standarden fixar språket som multiparadigm : en kombination av procedurell , funktionell och objektorienterad programmering stöds . Särskilt objektorienterad programmering tillhandahålls av språkets CLOS -system ; och systemet med Lisp-makro låter dig introducera nya syntaktiska konstruktioner i språket, använda teknikerna för metaprogrammering och generisk programmering .
Arbetet med dialekten började 1981 på förslag av DARPA -chefen Bob Engelmore.
Utvecklingen samordnades via e-post och språkets ursprungliga struktur har omarbetats avsevärt allt eftersom det fortskrider. Den första översikten över utvecklingen av standarden presenterades av Guy Lewis Steele vid ACM Symposium on Lisp and Functional Programming 1982, och det första dokumentet om språket publicerades 1984 ("The Common Lisp Language, First Edition"). Den andra utgåvan, som släpptes 1990, innehöll många ändringar som gjorts av ANSI i språket under standardiseringsprocessen. Den slutliga versionen av standarden publicerades 1994.
Från och med 2018 har inga uppdateringar av standarden släppts, och olika tillägg och förbättringar av Common Lisp (som Unicode-stöd, samtidighet, CLOS-baserad I/O) tillhandahålls av implementeringar och bibliotek (många tillgängliga via Quicklisp ).
Common Lisp använder S-uttryck för att beteckna både kod och data . Funktions- och makroanrop är listor , där det första elementet, eller listans huvud, är namnet på funktionen, och resten, "svansen" på listan, är argumenten .
( +22 ) ; _ _ lägger till 2 och 2, vilket ger resultatet 4. ( - 8 3 ) ; subtraherar tre från åtta, vilket ger resultatet 5. ( omvänd "Hej, värld!" ) ; vänder strängen och returnerar ""!rome ,yuvtswardZ"" ;; definitioner av variabler och funktioner: ( defvar *x* ) ; Definierar variabeln *x* utan att tilldela någon ; värden. Två asterisker som är en del av namnet accepteras ; standard för namngivning av globala variabler. ( setf *x* 42.1 ) ; tilldelar flyttalsvärdet 42,1 till variabeln *x*. ( defun square ( x ) ; Definiera en funktion kvadrat som tar ett argument ( * x x )) ; och återvänder sin kvadrat. ( kvadrat *x* ) ; anropar kvadratfunktionen och ger den värdet av *x* ; och ger tillbaka sin kvadrat (1772.41). ( låt (( a3 ) ( b4 ) ) ( + ab ) ) ; Den speciella formen låter skapar lokala variabler, tilldelar dem värden ; (i detta fall tilldelas variabeln a värdet 3 och b - 4), ; beräknar sedan och returnerar resultatet av funktionen ; (i detta fall 7). Variabler är lokala, därför ; Försök att utvärdera ett värde (+ ab) utanför let-kroppen kommer att resultera i ett fel.Numeriska typer inkluderar heltal , bråk , flyttal , och komplexa tal [2] . Common Lisp gör det möjligt att använda stora tal för att representera vilken kvantitet som helst med större precision.
Tecken i Common Lisp är inte begränsade till ASCII , de flesta moderna implementeringar stöder Unicode .
Konceptet med en symbol, som praktiskt taget inte används i denna form på andra språk, är en av de viktigaste, det är ett unikt dataobjekt, inklusive: namn, värde, funktion, lista över egenskaper och paket (namnutrymme). Symboler i Lisp används ofta på samma sätt som identifierare på andra språk: för att lagra värdet på en variabel. Men de har många andra användningsområden. Vanligtvis, när ett värde tilldelas en symbol, returneras det omedelbart till dem. Vissa symboler tilldelar sig själva ett värde, till exempel representeras booleska värden som två självdefinierande symboler, Toch NIL.
Det finns flera funktioner för att avrunda skalärtyper på olika sätt. Funktionen roundavrundar argumentet till närmaste heltal, och om talet är "i mitten", så till närmaste jämna tal. Funktionen truncateavrundar siffror mot noll. flooroch fungerar avrunda ceilingtill närmaste lägre respektive närmast högre nummer. Alla funktioner returnerar bråkdelen som ett sekundärt resultat.
Sekvenser i Common Lisp är listor, vektorer, bitvektorer och strängar. Det finns många operationer som kan fungera med vilken typ av sekvens som helst.
Liksom nästan alla andra Lisp-dialekter är listor i Common Lisp uppbyggda av prickade par ( conses ). cons är en datastruktur med två platser: caroch cdr. Listan är en sammankopplad kedja av prickade par (eller kan vara tom). carvarje par hänvisar till ett element i en lista (möjligen en annan lista). cdrvarje par refereras av nästa par, förutom det sista paret i listan, vars cdrvärde är nil. Punktpar kan också enkelt användas för att implementera träd och andra komplexa datastrukturer; även om det generellt rekommenderas att använda strukturer eller klassinstanser istället. Det är också möjligt att skapa en cirkulär datastruktur med prickade par.
Common Lisp stöder flerdimensionella arrayer och kan dynamiskt ändra storlek på justerbara arrayer efter behov. Flerdimensionella arrayer kan användas för matrisberäkningar. En vektor är en endimensionell array. Arrayer kan innehålla vilken typ som helst som ett element (till och med blanda olika typer i samma array) eller kan vara specialiserade för att bara innehålla en specifik typ. Vanligtvis stöds bara ett fåtal typer. Många implementeringar kan optimera arrayfunktioner när arrayen är typspecialiserad. Det finns två standardtypspecialiserade arrayer: en sträng, som är en teckenvektor ( char), och en bitvektor .
En hashtabell lagrar en mappning mellan objekt. Alla objekt kan användas som nyckel eller värde. Hashtabeller ändrar automatiskt storleken efter behov.
Paket är samlingar av symboler som främst används för att separera delar av ett program i namnutrymmen . Ett paket kan exportera vissa symboler genom att markera dem som en del av det offentliga gränssnittet. Paket kan använda andra paket.
Strukturer , liknande strukturer i C och poster i Pascal , representerar godtyckliga komplexa datastrukturer med valfritt antal och typ av fält (kallade slots ). Strukturer tillåter enstaka arv.
Klasser , en del av CLOS- objektsystemet , liknar strukturer, men de ger flera arv och mer dynamiskt beteende. Klasser lades till sent till Common Lisp och överlappar strukturerna något begreppsmässigt. Objekt skapade från klasser kallas instanser. Ett specialfall är generiska funktioner som är både funktioner och instanser.
Common Lisp stöder förstklassiga funktioner . Du kan till exempel skriva funktioner som tar andra funktioner som argument eller returfunktioner.
Common Lisp-biblioteket är starkt beroende av sådana funktioner. Till exempel sorttar funktionen en jämförelsefunktion och valfritt en nyckelfunktion för att sortera datastrukturerna enligt nyckeln.
;; Sorterar listan med funktionerna > och <. ( sortera ( lista 5 2 6 3 1 4 ) #' > ) ; returnerar (6 5 4 3 2 1) ( sortera ( lista 5 2 6 3 1 4 ) #' < ) ; returnerar (1 2 3 4 5 6) ;; Sorterar listan efter de första elementen i underlistorna. ( sortera ( lista ' ( 9 A ) ' ( 3 B ) ' ( 4 C ) ) # ' < : nyckel # ' först ) ; returnerar ((3 B) (4 C) (9 A)) FunktionsdefinitionerMakrot defundefinierar en funktion. defunaccepterar ett funktionsnamn, parameternamn och en funktionskropp:
( defun square ( x ) ( * x x ))Funktionsdefinitioner kan inkludera kompilatordirektiv , kända som eng. declarations , som ger tips till kompilatorn om optimeringar eller argumenttyper. Dokumentationssträngar ( docstrings ) kan också läggas till , som Lisp kan använda för att tillhandahålla dokumentation:
( defun square ( x ) "Beräknar kvadraten av single-float x." ( declare ( single-float x ) ( optimize ( speed 3 ) ( debug 0 ) ( safety 1 ))) ( single - float ( * x ) x )))Anonyma funktioner definieras med lambdat.ex. (lambda (x) (* x x)) kvadreringsfunktionen. Programmeringsstilen Lisp innebär frekvent användning av funktioner av högre ordning, till vilka det är bekvämt att skicka anonyma funktioner som argument.
Lokala funktioner kan deklareras med fletoch labels.
( platt (( kvadrat ( x ) ( * x x ))) ( kvadrat 3 ))Det finns flera andra operatörer relaterade till att definiera och manipulera funktioner. Till exempel kan funktioner kompileras med compileen operatör. (Vissa Lisp-system kör funktioner med standardtolken om inte kompilering anges; andra kompilerar varje funktion).
Common Lisp skiljer sig från språk som C# , Java , Perl , Python genom att den definieras av sin egen standard och det finns ingen enskild eller kanonisk implementering av den. Vem som helst kan läsa standarden och skapa sin egen implementering. Common Lisp känner automatiskt igen dessa typer som lika. [3]
namn | Plattformar som stöds | Kompilering | Förmågor | Licens |
---|---|---|---|---|
CLISP [6] | Windows , Mac , *nix | Bytekod , JIT | Liten bildstorlek av lispsystemet. Mycket effektiv aritmetik för långa heltal. Möjlighet att skapa körbara filer. FFI (gränssnitt för anrop av lågnivåfunktioner (funktioner från bibliotek skrivna i C, etc.) och för att arbeta med "ohanterat" minne). Callback-funktioner (integration med "native" plattformskod). | GNU GPL |
CMUCL [7] | Linux , FreeBSD , Solaris , Darwin | Bytekod, maskinkod | Högkvalitativ kompilator till maskinkod. FFI. Callback-funktioner (integration med "native" plattformskod). | Allmän egendom med delar under BSD-licens |
ECL | Windows, *nix, Mac OS X | Bytekod, maskinkod via C | Bra integration med C-program och med direkt körbar plattformskod (FFI, callback-funktioner, möjlighet att skapa binära dynamiska och statiska bibliotek). Möjlighet att skapa körbara filer. Multithreading på alla plattformar som stöds. | GNU GPL med delar under andra licenser |
Clozure CL (tidigare OpenMCL) [8] | Linux/PPC, Linux/X86-64, Darwin/PPC, Darwin/X86-64, FreeBSD/X86-64, Windows | maskinkod | Snabb kompilator. Kraftfull och bekväm FFI. Callback-funktioner (integration med plattformens binära kod). Möjlighet att skapa körbara filer. Multithreading på alla plattformar som stöds. | LGPL |
SBCL [9] | Linux, BSD , Solaris, Mac OS X (Darwin), Windows (experimentell) | maskinkod | Avancerad kompilator till maskinkod. Möjlighet att skapa körbara filer. FFI. Callback-funktioner (integration med plattformens binära kod). Multithreading på Linux, Solaris 10 och Mac OS X. | Allmän egendom med delar under MIT-licens och BSD-licens |
ABCL [10] | JVM | JVM -bytekod | Gränssnitt till Java-plattformen. Multithreading. Plattformsoberoende. | LGPL |
Allegro Common Lisp [11] | Windows, Unix , Linux, Mac OS X | maskinkod | Kommersiell, begränsad demo tillgänglig | |
LispWorks [12] | Windows, *nix, Mac OS X | maskinkod | Utvecklad IDE. CAPI är ett bibliotek för att skapa ett användargränssnitt. Bra integration med C-program och med "native" plattformskod (FFI, callback-funktioner, möjlighet att skapa inbyggda dynamiska och statiska bibliotek för plattformen). Möjlighet att skapa körbara filer. Multithreading på alla plattformar som stöds. | Kommersiell, begränsad demo tillgänglig |
Corman Common Lisp | Windows | maskinkod | Sedan 2015 - MIT-licens . Ursprungligen distribuerad som Shareware, med systemkällkod tillgänglig (exklusive IDE) |
Vanlig Lisp | |||||||
---|---|---|---|---|---|---|---|
Genomföranden |
| ||||||
programvara |
| ||||||
Publikationer |
| ||||||
designkommitté |
| ||||||
Övrig |
|
Läspa | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Egenskaper |
| ||||||||||||||
Genomföranden |
| ||||||||||||||
Hårdvara |
| ||||||||||||||
gemenskap |
| ||||||||||||||
|
Programmeringsspråk | |
---|---|
|