© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Introduktion til Lisp

 

 

Fra sidst i 50'erne Lisp blev opfundet af John McCarty i sidste halvdel af 50'erne, og i 1959 så Lisp dagens lys. Hver gang jeg beskæftiger mig med Lisp bliver jeg slået af, at man allerede sidst i 50'erne kunne abstrahere så meget fra "maskinen" som man gør i Lisp. Langt de fleste af de tidlige sprog var ellers stærkt præget af CPU'ens instruktioner, og var meget imperativt orienterede. Skal man placere Lisp paradigmisk, er der ingen tvivl om, at det er et funktionelt sprog, men det har dog ikke afholdt folk fra at programmere i det med mange andre paradigmer - en øvelse vi dog vil afholde os fra.
Kunstrig intelligens Lisp's primære anvendelsesområde har været kunstig intelligens, og den succes sproget har haft på dette område (hvis man ellers tager forbehold for den kunstrige intelligens beskedne succes i almindelighed) har i nogens øjne påvirket det - der er dem der taler om det oprindelige "rene Lisp", der blev "ødelagt" af dem der ville gøre det mere effektivt. Det skal dog nok mest ses som et udtryk for at Lisp for mange er blevet "kult"!

 

Det funktionelle paradigme

Lisp er som nævnt et funktionelt sprog - det tilhører det funktionelle paradigme. Set med det funktionelle paradigmes "briller" er et sprog en samling af funktioner og kald af disse. Næsten alle sprog har funktioner, eller det der ligner, og et sprog tilhører ikke det funktionelle paradigme alene fordi det har funktioner - i så fald ville Java også tilhøre det funktionelle paradigme. Der er et ekstra krav, som diskvalificerer langt de fleste sprog med funktioner: der må ikke være nogen tilstand i programmet - der må ikke være nogen variable!
I virkeligheden diskvalificerer det også Lisp, for som vi skal se senere, er det muligt at lave noget der i al væsentlighed er det samme som variable - at man binder en værdi til et symbol. Det er dog ikke usædvanligt at et sprog går på paradigmisk kompromis med virkeligheden, og man behøver ikke tænke længere end til de ikke-objektorienterede dele af Java - f.eks. de primitive typer, som kan være besværlige; hvis man f.eks. vil opbevare dem i en hægtet liste

 

Funktioner

Vi skal senere se meget mere på funktioner i Lisp, men det vil mildne det syntaktiske "chock"; hvis vi allerede her ser hvordan et funktionskald ser ud.
Fra f.eks. Java er vi vant til at et funktions-kald (eller metode-kald, som det hedder i Java) f.eks. kan havde følgende udseende:
 
f( 4, 5 )
Et tilsvarende funktions-kald
 
(f 4 5)
Funktionens navn rykker indenfor i parantesen, og der bruges kun mellemrum til at adskille parametrene.
Operatorer i Lisp er funktioner. F.eks. kan man lægge to tal sammen med:
> (+ 3 4)
7

 

Symboler

Symboler i Lisp svarer til identifiers i Java - det er navne. Da Lisp ikke bruger infix notation (f.eks.: 2+3, hvor '+' står mellem 2 og 3) er der langt større frihed mht. syntaksen af symboler i Lisp. Man kan bruger tegnene: +, - osv ud over bogstaver og tal (start dog altid et symbol med et bogstav).
Selvom Lisp er et funktionelt sprog, er det ikke et rent funktionelt sprog - man kan lave variable. Dette gøres ved at tilknytte en værdi til et symbol. Man skaber denne sammenhæng ved at kalde funktionen: setq. F.eks.:
[19]> x

*** - EVAL: variable X has no value
1. Break>
> (setq x 5)
5
> x
5
Ikke case-sensitive I forbindelse med symboler, er det værd at bemærke, at disse ikke er case-sensitive, som man ellers kender det fra Java, og andre sprog.