LISP PVV-kurs 11. mars 2010

Like dokumenter
LISP PVV-kurs 25. oktober 2012

Sideeekter og makroer i Lisp

Lisp 2: Lister og funksjoner

Lisp 5: Makroer. Programvareverkstedet. 29. april 2010

Lisp 3: Spesielle former, variabler, imperativ programmering

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering. Muterbare data

Høyere-ordens prosedyrer

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

Eksamen i SLI230, vår 2003.

Stack. En enkel, lineær datastruktur

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

INF2810: Funksjonell Programmering. Eksamensforberedelser

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

Kunnskapsbasert Engineering (KBE) med Common Lisp

INF2810: Funksjonell Programmering. Introduksjon

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

Denne oppgaven innfører funksjoner, og viser hvordan vi kan skrive og teste funksjoner i Ellie.

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

Kap 2: Løkker og lister

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven

UNIVERSITETET I OSLO

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

Finne ut om en løsning er helt riktig og korrigere ved behov

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab

Kapittel 1 En oversikt over C-språket

INF2810: Funksjonell Programmering. Introduksjon

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Bygge en pyramide. Introduksjon. Steg 1: Lage en ny mod. Sjekkliste. Skrevet av: Pål G. Solheim

Innlevering 2a i INF2810, vår 2017

Finne ut om en løsning er helt riktig og korrigere ved behov

INF2810: Funksjonell Programmering. Trær og mengder

INF225 høsten 2003 Prosjekt del 4: kodegenerering

Innlevering 2b i INF2810, vår 2017

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Tilstand og verditilordning

UNIVERSITETET I OSLO

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Steg 1: Få noe på skjermen

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Strømmer

IN uke 1. Komme i gang med programmering

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

UNIVERSITETET I OSLO

IN uke 1. Komme i gang med programmering

Betinget eksekvering og logiske tester i shell

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Hva er kompilering? Dagens tema. En kompilator En kompilator leser Minila koden og lager Flok koden.

Norsk (English below): Guide til anbefalt måte å printe gjennom plotter (Akropolis)

Kap. 4: Ovenfra-ned (top-down) parsering

Velkommen til INF2100

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

TDT4110 IT Grunnkurs Høst 2014

INF2810: Funksjonell Programmering. Trær og mengder

Læringsmål og pensum. v=nkiu9yen5nc

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7

Matematikk Øvingsoppgaver i numerikk leksjon 1. Løsningsforslag

Øvingsforelesning TDT4105 Matlab

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

Transkript:

LISP PVV-kurs 11. mars 2010

LISP has jokingly been described as the most intelligent way to misuse a computer. I think that description a great compliment because it transmits the full flavor of liberation: it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts. Edsger Dijkstra

Oversikt over kurset (Del 1: Historie og grunnleggende Lisp) (Del 2: Lister og funksjoner) (Del 3: Spesielle former, verdier og variabler, imperativ programmering)

(Historie) Eirik Alderslyst Nygaard Øystein Ingmar Skartsæterhagen Programvareverkstedet 11. mars 2010

(Historie) (Først: Få tak i en Lisp) (For Emacs-brukere: # aptitude install sbcl slime Gjør deretter M-x slime i Emacs) (For ikke-emacs-brukere: # aptitude install sbcl $ sbcl ) (PVV-medlemmer kan kjøre sbcl eller slime på en PVV-maskin (f.eks. sprint))

(I begynnelsen) (Historie) (I begynnelsen var NIL) (McCarthy sa CONS, og det ble lister)

(Prehistorisk tid) (Historie) (1956: IPL (Information Processing Language), assemblyspråk for listeprosessering) (1957: Den første FORTRAN-kompilatoren) (FLPL (FORTRAN List Processing Language))

(Historie) (Begynnelsen på Lisp) (1958: John McCarthy forsøkte å bruke FLPL til å lage et system for symbolsk derivasjon) (Problemer med FORTRAN: Ingen rekursjon eller IF, tungvint å frigjøre minne) (Høsten 1958 startet McCarthy sammen med Marvin Minsky arbeidet med LISP)

(LISP) (Historie) (1960: LISP blir beskrevet i McCarthys artikkel Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I (del 2 ble aldri skrevet)) (To typer notasjon: M-uttrykk (innfiks, komplisert syntaks) for å skrive programmer, S-uttrykk (prefiks, enkel syntaks) for data og intern representasjon av programmer) (Artikkelen inneholdt en beskrivelse av EVAL en funksjon som evaluerer et LISP-uttrykk) (Steve Russell lagde den første Lisp-interpreteren ved å oversette EVAL til maskinkode for IBM 704) (Siden har ingen sett noe til M-uttrykkene)

(Dialekter) (Historie) (Mange varianter av Lisp ble implementert for forskjellige maskiner i løpet av 1960- og 1970-årene: Maclisp, Interlisp, Franz Lisp, ZetaLisp,... ) (1975: Scheme, første dialekt med leksikalt skop) (1984: Emacs Lisp) (1984: Common Lisp, standard i form av konglomerat av tidligere dialekter) (I dag: Hovedsakelig Scheme og Common Lisp som brukes)

(Historie) (Struktur og tolking av Lisp-programmer) (Et Lisp-program består av Lisp-objekter) (Objektene i et program kan evalueres til andre objekter) A LISP programmer knows the value of everything, but the cost of nothing. Alan Perlis

(Historie) (Noen ting evaluerer til seg selv) 43 43 2 2 "hallo, verden" "hallo, verden" t T nil NIL (Pilen står her for «evaluerer til». Den er ikke en del av Lisp) (Så evaluering gir bare ut igjen det man putter inn? (Det virker ikke veldig nyttig))

(Aritmetikk) (Historie) (+ 2 2) 4 (* 3 5) 15 (- 12 4) 8 (/ 12 4) 3 (De aritmetiske operasjonene +, *, - og / er funksjoner som tar tall som argumenter) (Vi kaller en funksjon ved å skrive funksjonsnavnet og argumentene adskilt med mellomrom innenfor et par parenteser)

(Historie) (Kan funksjonene ta mer enn to argumenter?) (+ 1 2 3 4 5 6 7 8 9 10) 55 (* 1 2 3 4 5) 120

(Historie) (Kan vi ha funksjonskall inni funksjonskall inni...?) (+ 4 5) 9 (+ (* 2 2) 5) 9 (Vi kan sette uttrykk inni uttrykk inni... ) (+ (* 2 3) (/ 10 (+ 2 2 (- 8 7))) (- 5 3)) 10 (LISP står forresten for «Lots of Irritating Silly Parentheses»)

(Historie) (Vi lager nye funksjoner) (Vi kan DEfinere nye FUNksjoner med DEFUN) (defun navn parameterliste funksjonskropp ) (For eksempel kan vi lage en funksjon SQUARE som kvadrerer et tall) (defun square (x) (* x x)) (Når vi evaluerer (square 4) blir kroppen til SQUARE evaluert med 4 satt inn for X) (square 4) (* 4 4) 16

(En større funksjon) (Historie) a c b c = a 2 + b 2 (defun hypothenuse (side1 side2) (sqrt (+ (square side1) (square side2)))) (Moral: funksjoner kan ha mer enn ett parameter, og funksjonskroppen kan være et vilkårlig komplisert uttrykk) (hypothenuse 6 8) 10

(Historie) (Hva skjer når vi kaller HYPOTHENUSE?) (defun square (x) (* x x)) (defun hypothenuse (side1 side2) (sqrt (+ (square side1) (square side2)))) (hypothenuse 6 8) (sqrt (+ (square 6) (square 8))) (sqrt (+ (* 6 6) (* 8 8))) (sqrt (+ 36 64)) (sqrt 100) 10

(Historie) (Betinget evaluering med IF) (defun describe-number (n) (if (evenp n) "It is even!" "It is odd!")) (describe-number 37) "It is odd!" (describe-number 42) "It is even!"

(Eksempel: Fakultet) (Historie) { 1 hvis n = 0 n! = n (n 1)! ellers (defun! (n) (if (= n 0) 1 (* n (! (- n 1)))))

(Evaluering av!) (Historie) (defun! (n) (if (= n 0) 1 (* n (! (- n 1))))) (! 0) 1 (! 1) (* 1 (! 0)) (* 1 1) 1 (! 2) (* 2 (! 1)) (* 2 1) 2

(Eksempel: Fibonacci) (Historie) f (0) = 1 f (1) = 1 f (n) = f (n 1) + f (n 2) (for n >= 2) (defun fib (n) (if (< n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))

(Lister) (Historie) (Lister er gøy) (list 1 2 3) (1 2 3) (list 42) (42) (LIST er en funksjon som tar vilkårlig mange argumenter og returnerer alle i en liste) (first (list 1 2 3)) 1 (rest (list 1 2 3)) (2 3) (FIRST gir det første elementet i en liste) (REST gir hele listen unntatt det første elementet)

(Historie) (FIRST av REST av REST av...) (first (rest (list 1 2 3))) 2 (first (rest (rest (list 1 2 3)))) 3 (FIRST gir første element. For å få tak i et vilkårlig element kan vi gå nedover listen med REST vilkårlig mange ganger og så ta FIRST)

(Historie) (Eksempel: Plukk ut n-te element) (defun elem (n list) (if (= n 0) ; hvis N er 0 (first list) ; vil vi ha første element, (elem (- n 1) ; ellers vil vi ha (N-1)-te (rest list)))) ; fra resten av listen (elem 2 (list 2 3 5 7 11)) 5 (I virkeligheten vil man bruke funksjonen NTH for dette)

(Historie) (Den tomme listen og alle de andre) (Den tomme listen er ikke som andre lister) (list) NIL (Den tomme listen heter NIL) (NIL er også verdien for usant. Dette er litt forvirrende) (null (list 1)) NIL (null (list)) T (NULL sjekker om en liste er den tomme listen)

(Listenavigasjon) (Historie) (FIRST, REST og NULL gir oss all informasjonen vi trenger for å komme oss rundt i en liste) (FIRST gir oss et element (det første)) (REST lar oss komme videre til resten av listen) (NULL forteller oss når det er på tide å stoppe) (Ved hjelp av disse tre funksjonene kan vi skrive mange funksjoner som gjør nyttige ting med lister)

(Historie) (Eksempel: Lengden til en liste) (defun len (list) (if (null list) ; Hvis listen er tom 0 ; er lengden 0, (+ 1 ; ellers er den 1 pluss (len ; lengden til (rest list))))) ; resten av listen. (list-length (list 1 2 3)) 3 (list-length (list)) 0 (I virkeligheten vil man bruke funksjonen LENGTH istedenfor å lage denne)

(Historie) (Eksempel: Sum av en liste med tall) (defun sum (list) (if (null list) ; Hvis listen er tom 0 ; er dens sum 0, (+ (first list) ; ellers første tall pluss (sum ; summen av (rest list))))) ; resten av listen. (sum (list 1 2 3 4 5)) 15 (sum (list)) 0

(Sitering) (Historie) (+ 4 38) 42 (+ 4 38) (+ 4 38) pi 3.14159... pi pi (Ved å sitere et uttrykk beskytter vi det fra å bli evaluert) (Et parentetisert uttrykk i koden er en liste akkurat som dem vi lager med LIST) (Ord i koden (som + og pi over) er symboler)

(Historie) (CONStruksjon av lister) (cons 3 (4 5 6)) (3 4 5 6) (cons + (37 5)) (+ 37 5) (cons foo (bar)) (FOO BAR) (cons foo nil) (FOO) (CONS gjør det motsatte av FIRST og REST: Den hekter på en ny verdi på begynnelsen av en liste)

(Eksempel: ι) (Historie) (defun iota (a b) (if (> a b) nil (cons a (iota (+ a 1) b)))) (iota 7 4) NIL (iota 4 7) (4 5 6 7) (iota 38 38) (38)

(Historie) (Eksempel: Slå sammen to lister) (defun cat (list1 list2) ; meow (if (null list1) list2 (cons (first list1) (cat (rest list1) list2)))) (cat nil (a b c)) (A B C) (cat (foo) (bar baz)) (FOO BAR BAZ) (I virkeligheten ville man brukt APPEND)

(Historie) (Eksempel: Sett inn element i liste) (defun insert (elem i list) (if (= i 0) (cons elem list) (cons (first list) (insert elem (- i 1) (rest list))))) (insert er 1 (lister fine)) (LISTER ER FINE)

(Historie) (Du kan snakke med Lispen din via et REPL en READ-EVAL-PRINT-loop) (READ: Lisp leser det du skriver og bygger fine listestrukturer av det) (EVAL: Lisp evaluerer uttrykket den leste) (PRINT: Lisp presenterer stolt verdien den er kommet frem til så du skal få glede av den) (Loop: Det hele gjentas)

(Historie) (Slik ser et REPL ut) CL-USER> (defun! (n) (if (= n 0) 1 (* n (! (- n 1)))))! CL-USER> (! 5) 120 CL-USER> (! (! 5)) 66895029134491270575881180540903725867527463331380 29810295671352301633557244962989366874165271984981 30815763789321409055253440858940812185989848111438 9650005964960521256960000000000000000000000000000 CL-USER>

(Oppgaver) (Oppgaver) La funksjonen f : N N være definert ved { n f (n) = 2 hvis n er partall 3n + 1 hvis n er odde 1 Skriv en funksjon COLLATZ som beregner f. 2 Skriv en funksjon COLLATZ-LENGTH som for et naturlig tall n returnerer det minste naturlige tallet k slik at f k (n) = 1. 3 Vil COLLATZ-LENGTH alltid terminere? (collatz-length 1) 0 (collatz-length 4) 2 (collatz-length 5) 5

(Oppgaver) (Løsningsforslag) (defun collatz (n) (if (evenp n) (/ n 2) (1+ (* n 3)))) (defun collatz-length (n) (if (= n 1) 0 (+ 1 (collatz-length (collatz n)))))