Vanlig Lisp

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 .

Historik

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

Syntax

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.

Datatyper

Skalära typer

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.

Datastrukturer

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.

Funktioner

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

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

Implementeringar

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]

Jämförelsetabell över större implementeringar [4] [5]
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)

Anteckningar

  1. ANSI INCITS 226-1994 (R2004) , tidigare X3.226-1994 (R1999)
  2. Funktioner i Common Lisp Arkiverad 26 december 2009.
  3. Lisp är ett programmerbart programmeringsspråk. . Hämtad 24 april 2010. Arkiverad från originalet 12 september 2009.
  4. Lista över stora Common Lisp-implementeringar . Hämtad 15 maj 2007. Arkiverad från originalet 1 maj 2007.
  5. Lisp Implementations Arkiverad 4 juli 2008.
  6. [ GNU CLISP  ] . . Hämtad 24 april 2010. Arkiverad från originalet 16 mars 2010. GNU CLISP  . ]
  7. CMUCL . Hämtad 15 maj 2007. Arkiverad från originalet 30 oktober 2005.
  8. Clozure C.L. Hämtad 10 juni 2008. Arkiverad från originalet 5 mars 2018.
  9. [ Stål packar ihop Common Lisp  ] . Hämtad 24 april 2010. Arkiverad från originalet 6 juni 2004. Steel Bank Common  Lisp
  10. Armed Bear Common Lisp (nedlänk) . Hämtad 10 juni 2008. Arkiverad från originalet 29 mars 2007. 
  11. [ Allegro CL - utvecklad av Franz Inc. (engelska) . Hämtad 24 april 2010. Arkiverad från originalet 18 juni 2020. Allegro CL är en utvecklare av Franz Inc. (engelska) ]
  12. LispWorks Arkiverad 2 juni 2007 på Wayback Machine . Utvecklare - LispWorks, LLC (tidigare Xanalys, Inc.)

Länkar