Almindelig Lisp

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 .

Historie

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

Syntaks

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.

Datatyper

Skalartyper

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.

Datastrukturer

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.

Funktioner

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

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

Implementeringer

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)

Noter

  1. ANSI INCITS 226-1994 (R2004) , tidligere X3.226-1994 (R1999)
  2. Features of Common Lisp Arkiveret 26. december 2009.
  3. Lisp er et programmerbart programmeringssprog. . Hentet 24. april 2010. Arkiveret fra originalen 12. september 2009.
  4. Liste over større Common Lisp-implementeringer . Hentet 15. maj 2007. Arkiveret fra originalen 1. maj 2007.
  5. Lisp Implementations Arkiveret 4. juli 2008.
  6. [ GNU CLISP  ] . . Hentet 24. april 2010. Arkiveret fra originalen 16. marts 2010. GNU CLISP  . ]
  7. CMUCL . Hentet 15. maj 2007. Arkiveret fra originalen 30. oktober 2005.
  8. Clozure C.L. Hentet 10. juni 2008. Arkiveret fra originalen 5. marts 2018.
  9. [ Steel Bank Common Lisp  ] . Hentet 24. april 2010. Arkiveret fra originalen 6. juni 2004. Stålbank Fælles  Lisp
  10. Armed Bear Common Lisp (downlink) . Hentet 10. juni 2008. Arkiveret fra originalen 29. marts 2007. 
  11. [ Allegro CL - udviklet af Franz Inc. (engelsk) . Hentet 24. april 2010. Arkiveret fra originalen 18. juni 2020. Allegro CL er en udvikler af Franz Inc. (engelsk) ]
  12. LispWorks Arkiveret 2. juni 2007 på Wayback Machine . Udvikler - LispWorks, LLC (tidligere Xanalys, Inc.)

Links