Lisp: Forskelle mellem versioner

Content deleted Content added
m Tilføjet links
m Rettet flere links efter at have lært hvordan det gøres rigtigt
Linje 1:
'''Lisp''', eller '''LISP''' (forkortelse for LISt Processing) er et [[dynamisk typet]], [[funktionsorienteret]] [[programmeringssprog]].
 
==Oprindelse==
Sproget er baseret på en matematisk teori - [[Alonzo Church]]'s [[lambda calculus]] fra 1936. Det blev opfundet af [[John McCarthy]] i 1958. Beskrivelsen blev publiceret i 1960 og sproget blev for første gang implementeret af [Steve Russell] i 1961. Dermed er LISP et af de ældste højniveau-[[programmeringssprog]]; blandt de nulevende og stadigvæk mest udbredte er det kun [[Fortran]] der er ældre.
 
Sproget er baseret på en matematisk teori - [[Alonzo Church]]'s [[lambdakalkyle]] ([http://en.wikipedia.org/wiki/Lambda_calculus| lambda calculus]]) fra 1936. Det blev opfundet af [[John McCarthy]] i 1958. Beskrivelsen blev publiceret i 1960 og sproget blev for første gang implementeret af [[Steve Russell]] i 1961. Dermed er LISP et af de ældste højniveau-[[programmeringssprog]]; blandt de nulevende og stadigvæk mest udbredte er det kun [[Fortran]] der er ældre.
LISP har væsentlig betydning inden for [[kunstig intelligens]] og er velegnet til [[metaprogrammering]], sidstnævnte ikke mindst i kraft af et Lisps kendemærker: programmer og data har grundlæggende samme repræsentation; derved er det naturligt at lade programmer generere og transformere andre programmer.
 
==Anvendelse==
Både data og programmer repræsenteres i LISP i form af lister. En [liste] består af en samling elementer, som hver især enten kan være et [[atom]] - en simpel værdi eller et symbol - eller en liste. En liste er altså en [rekursiv] størrelse. Derfor defineres [[funktion]]er tit også rekursivt: man splitter en liste op i et hoved, som er det første element, og en hale, som udgøres af resten af listen. Halen består så af et hoved og en hale, osv.; i et grænsetilfalde er halen tom. Operationerne til at plukke hovedet hhvs. halen af en liste er blandt de grundlæggende operationer i LISP.
 
LISPLisp har væsentlig betydning inden for [[kunstig intelligens]] og er velegnet til [[metaprogrammering]], - sidstnævnte ikke mindst i kraft af et af Lisps kendemærker: programmer og data har grundlæggende samme repræsentation; derved er det naturligt at lade programmer generere og transformere andre programmer.
LISPs lister kan bruges til at repræsentere andre abstrakte datastrukturer. Fx kan et [[træ]] repræsenteres af en liste af lister.
 
==Program- og datarepræsentation==
I den oprindelige LISP eksisterer [arbejdslager]begrebet ikke, dvs. man opererer ikke med [variabler], og [[funktionskald]] har ingen [[bivirkninger]]; en funktion definerer en ren [transformation] af [[input]], som er en [[parameter]]liste, til en [[output]]værdi, som også er en liste.
 
Både data og programmer repræsenteres i LISPLisp i form af [[liste|lister]]. En [liste] består af en samling elementer, som hver især enten kan være et [[atom_(programmering)|atom]] - en simpel værdi eller et symbol - eller en liste. En liste er altså en [[rekursiv]] størrelse. Derfor definereser det naturligt også at definere [[funktionfunktion_(programmering)|funktioner]]er tit også rekursivt: manved splitterat endefinere listebehandlingen opaf i etlistens hoved, som er det første element, og enaf dens hale, som udgøres af resten af listen. Halen består så af et hoved og en hale, osv.; i et grænsetilfaldegrænsetilfaldet er halen tom, hvilket normalt bruges som stopkriteriet for rekursionen. Operationerne til at plukke hovedet hhvs. halen af en liste er blandt de grundlæggende operationer i LISP.
Moderne [[LISP-dialekter]] tillader et vist mål af bivirkninger. Nogle af dialekterne indfører også andre [[programmeringsparadigme]]r end det funktionsorienterede - fx det [[objektorienterede]].
 
LISPs lister kan bruges til at repræsentere andre [[abstrakte datastrukturer]]. Fx kan et [[træ]] repræsenteres af en liste af lister.
Når en LISP-funktion kaldes vil den ofte få en parameter med der indeholder oplysninger om den [[kontekst]] hvori kaldet fandt sted; dvs. virkningen af udførelsen af funktionskaldet kan afhænge meget af kaldets kontekst, ligesom et ords betydning ([[semantik]]) i et naturligt - dvs. almindeligt - sprog ofte afhænger af i hvilken sætning (eller, generelt, sammenhæng/kontekst) det nævnes.
 
I den oprindelige LISP eksisterer [[arbejdslager]]begrebet ikke, dvs. man opererer ikke med [[variabler]], og [[funktion|funktionskald]] harkan ingenderfor ikke have [[bivirkninger]]; en funktion definerer en ren [[transformation]] af [[input]], som er en [[parameter|parameterliste]]liste, til en [[output|outputværdi]]værdi, som også er en liste.
 
==Moderne udvidelser==
 
Moderne [[LISP-dialekter]] tillader et vist mål af bivirkninger, fx i forbindelse med udskrivning, filoperationer og operativsystemkald. Nogle af dialekterne indførerunderstøtter også andre [[programmeringsparadigme|programmeringsparadigmer]]r end det [[funktionsorienteret|funktionsorienterede]] - fx det [[objektorienteret|objektorienterede]].
 
==Kontekstbaserede funktionskald==
 
Når en LISP-funktion kaldes vil den ofte få en parameter med der indeholder oplysninger om den [[kontekst]] hvori kaldet fandt sted; dvs. virkningen af udførelsen af funktionskaldet kan afhænge meget af kaldets kontekst, ligesom et ords betydning ([[semantik]]) i et naturligtalmindeligt, -eller dvs. almindeligt -[[naturligt sprog]] ofte afhænger af i hvilken sætning (eller, generelt, sammenhæng/kontekst) det nævnes.
 
Denne egenskab kaldes også [[closure]].
 
==LISP-dialekter==
 
Blandt de mest udbredte og mere moderne Lisp-dialekter er:
* [http://en.wikipedia.org/wiki/Common_Lisp_Object_System| Common Lisp Object System (CLOS)], som udvider klassisk Lisp med avancerede faciliteter til objektorienteret programmering.
* [http://en.wikipedia.org/wiki/Scheme_(programming_language)| Scheme]
 
Også [[Logo]], det gamle børnevendte sprog som mest forbindes med [[skildpaddegrafik]], dvs. med at tegne figurer på skærmen vha. en lille virtuel skildpadde, er en Lisp-dialekt.
 
==Se også==
*[http://en.wikipedia.org/wiki/Logo_(programming_language)| Logo]
 
[[Kategori:Datalogi]]
[[Kategori:Programmeringssprog]]