Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Vet for lite om Common Lisp for å være ærlig, var mest det som gjorde at jeg brukte ordet eksotisk. Jeg har nok lite å bidra med i denne tråden. Men la det ikke stoppe en diskusjon om hva som er bra og dårlig med Common Lisp. :)

Lenke til kommentar

Lisp er en fasinerende verden. Fra de første papirene til McCarthy, til lisp-maskiner, the lambda papers, Common Lisp og CLOS.

 

Selv har jeg mest erfaring med scheme, men prøver å sette meg mer inn i CL nå. Virker som mange tror at CL er et funksjonellt språk, men det er lagt veldig til rette for sideeffekter. CL er jo et ganske annet beist enn scheme.

Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs."

 

CL har jo et veldig fleksibelt objektorienterings-system, CLOS, med bl.a. multimethods og den tilhørende MOP(Meta Object Protocol). Også har jo selvfølgelig CL makroer som de fleste lisp-systemer.

 

Denne artikklen forteller litt om Telenor sin erfaring med Common Lisp.

 

Driver å leser Lisp In Small Pieces. I løpet av 11 kapitler, eller 500 sider, går de gjennom 11 interpreters og 2 kompilatorer(til bytekode og til C).

Lenke til kommentar

Virker som mange tror at CL er et funksjonellt språk, men det er lagt veldig til rette for sideeffekter. CL er jo et ganske annet beist enn scheme.

 

Man kan programmere funksjonellt i CL, men må ikke. CL blir ofte kalt et beist siden det er så mange funksjoner definert i standarden, men selve syntaksen er jo enkel.

 

CLOS er det mange språk forsøker å oppnå med objektorientering, men ikke helt klarer. For ikke lenge siden var jeg på et fordrag om det siste nye: "aspect oriented programming". Det var som å få en beskrivelse av MOP - for 20 år siden.

 

Macroer er vel grunnen til at Lisp har overlevd i over 50 år. Macroer gjør CL til et programmerbart programeringsspråk og mange nye egenskaper ble lagt inn i språket som macroer. Macroer og også meget effektive til å lage domenespesifikke språk (DSL). Det blir ofte at man lager et språk som passer til datene og til applikasjonen sin på toppen av CL. Et bra eksempel på det er GOAL (Game Oriented Assemby Lisp) som Naughty Dog Software brukte når de laget spillene Crash Bandicoot and Jak and Daxter.

 

Når det gjelder server programvare så er det ganske rått og ha CL applikasjonen kjørende. Koble seg på den via sockets og kompilere inn nye funksjoner og data uten å stoppe applikasjonen. CLOS har t.o.m. en metode for å oppdatere eksisterende objekter i minne dersom man endrer klassedefinisjonene på programmet som kjører.

 

Lisp in Small Pieces er en bok jeg ikke har lest enda, men lenge har hatt lyst til å kjøpe.

 

Veldig flott lambda avatar du har.

Lenke til kommentar
  • 3 uker senere...
  • 1 måned senere...

Men ofte er det slik at de som har brukt Common Lisp har sett lyset og blitt frelst og så er det de som bare ser en mengde parenteser og blir skremt.

En av de ukjente fordelene med parentesene til Lisp er at de gjør det enklere å skrive kode. Jo, faktisk!

 

Jeg bruker Emacs og paredit.el. M-( kaller paredit-wrap-round, som omslutter det nærmeste Lisp-uttrykket bar med parenteser slik at det blir (bar). Dette betyr at jeg veldig enkelt kan gå fra (bar) til (while (foo) (bar)) bare ved å plassere markøren på åpningsparentesen til (bar) og skrive M-( while (foo).

 

I et C-aktig språk innebærer dette at vi går fra

 

bar();

til

 

while(foo()) {
   bar();
}

og for å få dét til like enkelt og kjapt, må vi først definere «snippets» for språket vi bruker (se TextMate/IntelliJ IDEA). Nå tillater riktignok C en å sløyfe krøllparentesene for enkeltuttrykk, men at denne forenklingen eksisterer bare understreker poenget.

 

Det fine med Lisp er at vi ikke trenger slike definisjoner eller forenklinger, fordi syntaksen er så regulær. Tilsvarende enkelt blir det å slette og flytte Lisp-kode rundt ettersom while-blokken over bare er enda en S-expression i Lisp.

Endret av ....
Lenke til kommentar

Jeg kan absolutt ingenting om Common Lisp (eller andre Lisp-språk for den saks skyld).

Brukes CL på samme måte som, la oss si, COBOL til for eksempel systemer for banker? Det ser ut som et interessant språk, men som sagt, jeg er helt død på dette området.

 

Common Lisp brukes feks. av ITA (Se artikkel på forsiden til hw ang. google) og av Telenor (cliky).

Lenke til kommentar

 

En av de ukjente fordelene med parentesene til Lisp er at de gjør det enklere å skrive kode. Jo, faktisk!

 

Jeg er helt enig med deg. Det er veldig enkelt å navigere i koden når man kan hoppe over over en matchende sexp som f.eks. en (if ...) osv.

 

Dessuten så sitter man ikke å teller parenteser heller. Editoren (ofte Emacs) matcher parenteser for en og indenterer koden. Har man et dypt uttrykk som f.eks.

 

(defun hello (arg)
 (if (some (very (long (nested (list (of (functions arg

 

Så er det bare et tastetrykk (C-cC-]) for å slenge på riktig antall parenteser for å matche opp til parentesen foran defun.

 

Common Lisp har jo veldig enkel syntax. Det er stort sett (funksjon arg0 arg1 ... argN). if er f.eks. ikke syntax. Det er en funksjon med tre argumenter: dersom det første gir en verdi forskjellig fra nil så returneres verdien av det andre argumentet, hvis ikke det tredje.

 

Mange syntes prefix notasjon er unaturlig (med unntak av de som har vokst opp med RPN kalkulator). Men ting blir ofte enklere. F.eks så er + bare en funksjon som legger sammen alle argumentene sine:

 

CL-USER> (+ 1 2 3 4 5 6 7 8 9 10)
55

 

Eller < funksjonen returnerer sann hvis alle argumentene er i stigende rekkefølge

 

CL-USER> (< 1 2 3 4 5 6 7 8 9 10)
T
CL-USER> (< 1 2 3 4 5 6 7 8 9 10 9)
NIL

Lenke til kommentar

if er f.eks. ikke syntax. Det er en funksjon med tre argumenter: dersom det første gir en verdi forskjellig fra nil så returneres verdien av det andre argumentet, hvis ikke det tredje.

 

Vel. IF er nok ikke en funksjon, men en "special operator". Men syntaksen er lik som funksjonskall, da.

 

(if 1
(format t "~a" 'a)
(format t "~a" 'b))

Lenke til kommentar

Vel. IF er nok ikke en funksjon, men en "special operator". Men syntaksen er lik som funksjonskall, da.

 

Det er korrekt. Det var en forenkling for å gjøre det enklere å forklare for andre, special forms, variable binding, osv. er litt enklere å nærme seg med terminiologi fra andre språk selv om det får ihuga lispere til å fryse på ryggen.

Lenke til kommentar

Common Lisp brukes feks. av ITA (Se artikkel på forsiden til hw ang. google)

 

ITA har ganske morsomme oppgaver man må løse før man kan sende inn jobb-søknaden:

 

Min lenkehttp://www.itasoftware.com/careers/puzzle_archive.html?catid=39

 

Ellers så var AI problemet som Lisp skulle løse. AI var veldig hot på 80-tallet, men så kom finanskrisa (hørt den før?) og AI-vinteren var et faktum. Men nå har AI blitt mer mainstream og aktuelt i f.eks. spill og semantic web applikasjoner. Jeg har forresten anbefalt boken Paradigms of Artificial Intelligence Programming her tidligere

 

Se også på noen av applikasjonene til kundene til Franz (klikk i venstre marg).

Lenke til kommentar

Hmm. Tenkte det kunne være det, ja. :p Sikkert en del som kan være greit å glatte over, som dynamisk binding og special forms som du nevner (og ikke minst continuations i de lispene som har det), men tenker at IF kanskje ikke er en av dem.

 

Edit: Ey, har ikke sett den før. Enda en ting å gjøre i sommer. :) God natt...

Endret av peterbb
Lenke til kommentar

Det er veldig enkelt å navigere i koden når man kan hoppe over over en matchende sexp som f.eks. en (if ...) osv.

En ting jeg nesten gjør oftere, er å gå opp et nivå med <C-M-up> (backward-up-list). Koden er jo implisitt et tre, og kan med fordel navigeres i som sådan.

 

Har man et dypt uttrykk som f.eks.

 

(defun hello (arg)
 (if (some (very (long (nested (list (of (functions arg

Så er det bare et tastetrykk (C-cC-]) for å slenge på riktig antall parenteser for å matche opp til parentesen foran defun.

Hvis du bruker paredit.el, blir parenteser autopairet slik at du slipper å tenke på dette. Når du taster (, settes både start- og sluttparentesen inn, med markøren imellom:

 

(|)

Når du så taster ), beveger markøren seg over den eksisterende sluttparentesen istedenfor å sette inn en ny:

 

()|

Dermed trenger du aldri levne dette med «riktig antall parenteser» en tanke. :)

Endret av ....
Lenke til kommentar

Jeg har ikke brukt paredit tidligere så jeg skal teste den og se hvordan jeg liker den.

 

 

Igjen takk for tipset. Det er litt uvant, spesielt når jeg skriver en defun osv. som går over flere linjer. Men jeg tror jeg kommer til å fortsette a bruke denne.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...