Almindelig Lisp | |
---|---|
Semantik | multi- paradigme : objektorienteret , funktionel , imperativ , metasprog |
Sprog klasse | programmeringssprog , proceduresprog , objektorienteret programmeringssprog , funktionelt programmeringssprog og multi-paradigme programmeringssprog |
Udførelsestype | kompileret |
Dukkede op i | 1984 , standardiseret af ANSI i 1994 |
Forfatter | Udvalg X3J13 |
Udvikler | X3J13 [d] |
Type system | stærk , dynamisk , med valgfri typeerklæringer |
Større implementeringer | Allegro Common Lisp , ABCL , CLISP , Clozure CL , CMUCL , Corman Common Lisp , ECL , LispWorks , Scieneer CL , SBCL |
Blev påvirket | Lisp , Lisp Machine Lisp , MacLisp , InterLisp , Scheme |
påvirket | Clojure , Factor , Dylan , EuLisp , ISLisp , SKILL , Stella , SubL |
Internet side | common-lisp.net _ |
Mediefiler på Wikimedia Commons |
Common Lisp (forkortet CL ) er en dialekt af programmeringssproget Lisp standardiseret af ANSI [1] . Det blev udviklet med det formål at forene de forskellige Lisp-dialekter i begyndelsen af 1980'erne; Adskillige implementeringer af Common Lisp er tilgængelige, både kommercielle og gratis .
Standarden fikserer sproget som multiparadigme : en kombination af proceduremæssig , funktionel og objektorienteret programmering er understøttet . Især objektorienteret programmering leveres af sprogets CLOS -system ; og systemet med Lisp-makroer giver dig mulighed for at introducere nye syntaktiske konstruktioner i sproget, bruge teknikkerne til metaprogrammering og generisk programmering .
Arbejdet med dialekten begyndte i 1981 efter forslag fra DARPA -manager Bob Engelmore.
Udviklingen blev koordineret via e-mail, og sprogets oprindelige struktur er blevet væsentligt omarbejdet, efterhånden som det skrider frem. Det første overblik over udviklingen af standarden blev præsenteret af Guy Lewis Steele på ACM Symposium on Lisp and Functional Programming i 1982, og det første dokument om sproget blev offentliggjort i 1984 ("The Common Lisp Language, First Edition"). Den anden udgave, udgivet i 1990, inkluderede mange ændringer foretaget af ANSI til sproget under standardiseringsprocessen. Den endelige version af standarden blev offentliggjort i 1994.
Fra 2018 er der ikke udgivet opdateringer til standarden, og forskellige udvidelser og forbedringer til Common Lisp (såsom Unicode-understøttelse, samtidighed, CLOS-baseret I/O) leveres af implementeringer og biblioteker (mange tilgængelige via Quicklisp ).
Common Lisp bruger S-udtryk til at angive både kode og data . Funktions- og makrokald er lister , hvor det første element, eller listens hoved, er navnet på funktionen, og resten, "halen" af listen, er argumenterne .
( +22 ) ; _ _ tilføjer 2 og 2 og returnerer resultatet 4. ( - 8 3 ) ; trækker tre fra otte og returnerer resultatet 5. ( omvendt "Hej verden!" ) ; vender strengen og returnerer ""!rome ,yuvtswardZ"" ;; definitioner af variable og funktioner: ( defvar *x* ) ; Definerer variablen *x* uden at tildele nogen ; værdier. To stjerner, der er en del af navnet - accepteret ; standard for navngivning af globale variabler. ( setf *x* 42,1 ) ; tildeler den flydende kommaværdi 42,1 til variablen *x*. ( defun square ( x ) ; Definering af et funktionskvadrat , der tager et argument ( * x x ) ) ; og returnerer sin plads. ( kvadrat *x* ) ; kalder kvadratfunktionen og giver den værdien af *x* ; og returnerer sin firkant (1772.41). ( lad (( a3 ) ( b4 ) ) ( + ab ) ) ; Den specielle form giver mulighed for at skabe lokale variabler, tildele dem værdier ; (i dette tilfælde tildeles variablen a værdien 3, og b - 4), ; beregner og returnerer derefter resultatet af funktionen ; (i dette tilfælde 7). Variabler er lokale, derfor ; forsøg på at evaluere en værdi (+ ab) uden for let-legemet vil resultere i en fejl.Numeriske typer omfatter heltal , brøker , flydende kommatal og komplekse tal [2] . Common Lisp gør det muligt at bruge store tal til at repræsentere enhver mængde med større præcision.
Tegn i Common Lisp er ikke begrænset til ASCII , de fleste moderne implementeringer understøtter Unicode .
Konceptet med et symbol, som praktisk talt ikke bruges i denne form på andre sprog, er et af de vigtigste, det er et unikt dataobjekt, herunder: navn, værdi, funktion, liste over egenskaber og pakke (navneområde). Symboler i Lisp bruges ofte på samme måde som identifikatorer på andre sprog: til at gemme værdien af en variabel. De har dog mange andre anvendelsesmuligheder. Normalt, når en værdi tildeles et symbol, returneres den straks til dem. Nogle symboler tildeler en værdi til sig selv, for eksempel er booleske værdier repræsenteret som to selvdefinerende symboler, Tog NIL.
Der er flere funktioner til afrunding af skalartyper på forskellige måder. Funktionen roundafrunder argumentet til det nærmeste heltal, og hvis tallet er "i midten", så til det nærmeste lige tal. Funktionen truncaterunder tal mod nul. Og floor- funktionerne ceilingafrundes til henholdsvis nærmeste lavere og nærmeste højere tal. Alle funktioner returnerer brøkdelen som et sekundært resultat.
Sekvenser i Common Lisp er lister, vektorer, bitvektorer og strenge. Der er mange operationer, der kan fungere med enhver type sekvens.
Som næsten alle andre Lisp-dialekter er lister i Common Lisp opbygget af prikkede par ( conses ). cons er en datastruktur med to slots: carog cdr. Listen er en forbundet kæde af prikkede par (eller kan være tom). carhvert par refererer til et element i en liste (evt. en anden liste). cdrhvert par henvises til af det næste par, undtagen det sidste par på listen, hvis cdrværdi er nil. Prikpar kan også nemt bruges til at implementere træer og andre komplekse datastrukturer; selvom det generelt anbefales at bruge strukturer eller klasseforekomster i stedet for. Det er også muligt at lave en cirkulær datastruktur med prikkede par.
Common Lisp understøtter multidimensionelle arrays og kan dynamisk ændre størrelsen på justerbare arrays efter behov. Multidimensionelle arrays kan bruges til matrixberegninger. En vektor er et endimensionelt array. Arrays kan indeholde enhver type som et element (endog blande forskellige typer i samme array) eller kan specialiseres til kun at indeholde en specifik type. Normalt understøttes kun få typer. Mange implementeringer kan optimere array-funktioner, når arrayet er typespecialiseret. Der er to standardtypespecialiserede arrays: en streng, som er en tegnvektor ( char), og en bitvektor .
En hash-tabel gemmer en kortlægning mellem objekter. Ethvert objekt kan bruges som en nøgle eller værdi. Hash-tabeller ændrer automatisk størrelse efter behov.
Pakker er samlinger af symboler, der primært bruges til at adskille dele af et program i navneområder . En pakke kan eksportere nogle symboler ved at markere dem som en del af den offentlige grænseflade. Pakker kan bruge andre pakker.
Strukturer , der ligner strukturer i C og poster i Pascal , repræsenterer vilkårlige komplekse datastrukturer med et hvilket som helst antal og type felter (kaldet slots ). Strukturer tillader enkeltarv.
Klasser , som er en del af CLOS -objektsystemet , ligner strukturer, men de giver multiple arv og mere dynamisk adfærd. Klasser blev tilføjet sent til Common Lisp og overlapper nogle strukturer konceptuelt. Objekter oprettet fra klasser kaldes forekomster. Et særligt tilfælde er generiske funktioner, der både er funktioner og instanser.
Common Lisp understøtter førsteklasses funktioner . For eksempel kan du skrive funktioner, der tager andre funktioner som argumenter eller returnerer funktioner.
Common Lisp-biblioteket er stærkt afhængig af sådanne funktioner. For eksempel sorttager funktionen en sammenligningsfunktion og eventuelt en nøglefunktion til at sortere datastrukturerne efter nøglen.
;; Sorterer listen ved hjælp af > og < funktionerne. ( sortér ( liste 5 2 6 3 1 4 ) #' > ) ; returnerer (6 5 4 3 2 1) ( sorter ( liste 5 2 6 3 1 4 ) #' < ) ; returnerer (1 2 3 4 5 6) ;; Sorterer listen efter de første elementer i underlisterne. ( sortere ( liste ' ( 9 A ) ' ( 3 B ) ' ( 4 C )) # ' < : tast # ' først ) ; returnerer ((3 B) (4 C) (9 A)) FunktionsdefinitionerMakroen defundefinerer en funktion. defunaccepterer et funktionsnavn, parameternavne og en funktionstekst:
( defun square ( x ) ( * x x ))Funktionsdefinitioner kan omfatte compiler- direktiver , kendt som eng. declarations , som giver hints til compileren om optimeringer eller argumenttyper. Dokumentationsstrenge ( docstrings ) kan også tilføjes , som Lisp kan bruge til at levere dokumentation:
( defun square ( x ) "Beregner kvadratet af single-float x." ( declare ( single-float x ) ( optimize ( speed 3 ) ( debug 0 ) ( safety 1 ))) ( single - float ( * x ) x )))Anonyme funktioner defineres med lambdafor eksempel (lambda (x) (* x x)) kvadreringsfunktionen. Lisp-stilen til programmering involverer hyppig brug af funktioner af højere orden, som det er praktisk at videregive anonyme funktioner til som argumenter.
Lokale funktioner kan deklareres med fletog labels.
( flad (( kvadrat ( x ) ( * x x ))) ( kvadrat 3 ))Der er flere andre operatører relateret til at definere og manipulere funktioner. For eksempel kan funktioner kompileres med compileen operatør. (Nogle Lisp-systemer udfører funktioner ved hjælp af standardfortolkeren, medmindre kompilering er angivet; andre kompilerer hver funktion).
Common Lisp adskiller sig fra sprog som C# , Java , Perl , Python ved, at det er defineret af sin egen standard, og der er ingen enkelt eller kanonisk implementering af det. Alle kan læse standarden og lave deres egen implementering. Common Lisp genkender automatisk disse typer som ligeværdige. [3]
Sammenligningstabel over større implementeringer [4] [5]Navn | Understøttede platforme | Samling | Evner | Licens |
---|---|---|---|---|
CLISP [6] | Windows , Mac , *nix | Bytekode , JIT | Lille billedstørrelse af lispsystemet. Meget effektiv lang heltal aritmetik. Mulighed for at oprette eksekverbare filer. FFI (grænseflade til at kalde funktioner på lavt niveau (funktioner fra biblioteker skrevet i C osv.) og til drift med "uadministreret" hukommelse). Callback-funktioner (integration med "native" platformskode). | GNU GPL |
CMUCL [7] | Linux , FreeBSD , Solaris , Darwin | Bytekode, maskinkode | Højkvalitets compiler til maskinkode. FFI. Callback-funktioner (integration med "native" platformskode). | Offentligt domæne med dele under BSD-licens |
ECL | Windows, *nix, Mac OS X | Bytekode, maskinkode via C | God integration med C-programmer og med direkte eksekverbar platformkode (FFI, tilbagekaldsfunktioner, mulighed for at skabe binære dynamiske og statiske biblioteker). Mulighed for at oprette eksekverbare filer. Multithreading på alle understøttede platforme. | GNU GPL med dele under andre licenser |
Clozure CL (tidligere OpenMCL) [8] | Linux/PPC, Linux/X86-64, Darwin/PPC, Darwin/X86-64, FreeBSD/X86-64, Windows | maskinkode | Hurtig compiler. Kraftig og praktisk FFI. Callback-funktioner (integration med platformens binære kode). Mulighed for at oprette eksekverbare filer. Multithreading på alle understøttede platforme. | LGPL |
SBCL [9] | Linux, BSD , Solaris, Mac OS X (Darwin), Windows (eksperimentel) | maskinkode | Avanceret compiler til maskinkode. Mulighed for at oprette eksekverbare filer. FFI. Callback-funktioner (integration med platformens binære kode). Multithreading på Linux, Solaris 10 og Mac OS X. | Offentligt domæne med dele under MIT-licens og BSD-licens |
ABCL [10] | JVM | JVM bytekode | Interface til Java-platformen. Multithreading. Platformens uafhængighed. | LGPL |
Allegro Common Lisp [11] | Windows, Unix , Linux, Mac OS X | maskinkode | Kommerciel, begrænset demo tilgængelig | |
LispWorks [12] | Windows, *nix, Mac OS X | maskinkode | Udviklet IDE. CAPI er et bibliotek til at skabe en brugergrænseflade. God integration med C-programmer og med "native" platformskode (FFI, tilbagekaldsfunktioner, mulighed for at skabe native dynamiske og statiske biblioteker til platformen). Mulighed for at oprette eksekverbare filer. Multithreading på alle understøttede platforme. | Kommerciel, begrænset demo tilgængelig |
Corman Common Lisp | Windows | maskinkode | Siden 2015 - MIT-licens . Oprindeligt distribueret som Shareware, med systemkildekode tilgængelig (undtagen IDE) |
Almindelig Lisp | |||||||
---|---|---|---|---|---|---|---|
Implementeringer |
| ||||||
Software |
| ||||||
Publikationer |
| ||||||
designudvalget |
| ||||||
Andet |
|
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Egenskaber |
| ||||||||||||||
Implementeringer |
| ||||||||||||||
Hardware |
| ||||||||||||||
Fællesskab |
| ||||||||||||||
|
Programmeringssprog | |
---|---|
|