1 Dagens föreläsning - Vad handlade kurserna (TDDC66 och TDDC67) egentligen om? - Vad skall vi kunna inför den skriftliga examinationen? - Vad skall vi ta med oss till andra kurser. - Vad kan vi förvänta oss mer i de fortsatta programmeringskurserna Imperativ programmering och Ada (vt1 C1/D1) Objektorienterad programmering och Java (ht1 C2/D2) Datastrukturer och algoritmer (ht1 C2/D2) Data- och programstrukturer (vt2 C2, Dh) - Vad finner vi i andra språk för konstruktioner vi lärt oss från Lisp-kursen.
2 Kurserna kan (vad gäller Lisp-momentet) delas upp i 6 huvusakliga områden: - Att skriva funktionella program - centrala begrepp var rekursion, funktion som dataobjekt, högre ordningens funktioner. Samt se likhet med induktion och andra rekursiva strukturer. - Att göra databstraktion - det centrala begreppet var abstrakta datatyper och kunna beskriva hur data är sammansatta,. genom att använda diskretmatematiska begrepp, mängder, kartesisk produkt, tupler, träd etc. - Att lösa problem - Att bryta ned problem till hanterbara programkomponenter. Top-down-modell. En funktion gör vanligen en sak. Ge bra namn på funktioner. - Att lära sig Lisp, hantera listor, arrayer, poster, grafiskt rita listor med boxar (consceller) och pilar (pekare), makrofunktioner. Att kunna använda repetitionsstrukturer i Lisp för att skriva imperativa program. - Att förstå programspråk - Mer kunskap och känsla vad programspråk är, grammatik, interpretator och kompilator. Dessutom fanns breddföreläsningen om datorspråk och prova-pålaborationer. - Att öva hanterverket att programmera. Laborationer och självständigt projekt. Design, kodning, testning, felsökning. Snygg programkod.
3 Du skall kunna skriva funktioner med olika beräkningsmodeller och kunna förklara vad som händer: - Rekursiv funktion med rekursiv processlösning med fördröjd beräkning och värdet beräknas på hemvägen - Rekursiv funktion med iterativ processlösning (svansrekursiv, tail recursion) med beräkning efter hand, ofta via en resultatparameter - Iterativ funktion med användning av explicit repetitionsstruktur och tilldelning Obs. Bland inte ihop rekursiv funktion med iterativ processlösning med iterativ funktion. Däremot. Se likheterna mellan dessa. I stort mekaniskt att överföra en rekursiv funktion med iterativ processlösning till en iterativ funktion. Lisp kan t ex vid kompilering transformera sådana funktioner program till iterativa program.
4 Du skall kunna använda rekursiva mallar för att göra: - Sekvens-traversering av lista (sekvens) på toppnivå - Skevens- traversering av en lista (sekvens) där elementen i sin tur är listor (sekvenser) - Binär träd-traversering av t ex punkterade par-strukturer, formelstrukter mm De två senare modellerna kallar vi dubbelrekursiva.
5 Du skall kunna identifiera olika typer av algoritmmönster: sökning efter givet element (finns-bokstav? i Övn 118, forwardfind i Uppg 2B) mappning, transformera varje elements värde till ett nytt och skapa en struktur av samma slag. (positiva i Uppg 1A, högre ordningens funktion mapcar) filtrering, skapa en ny struktur med alla elementen som uppfyller ett villkor (ta-bort-vokaler i Uppg 119, filtrera i Uppg 1A, filter Övn 213) reduktion (ackumulering), t ex summera alla talen i en sekvens (räkna i Uppg 1A, högre ordningens funktion reduce) back-tracking, sök först, bestäm sedan (eftersista i Uppg 205, backfind i Uppg 2C) generering, från ett värde skapa nästa (generate-list i Uppg 2E)
6 Träna mycket genom att lösa många uppgifter i de olika modellerna. Fundera på lösningarna, gör trace för att förstå bättre. Typisk tentauppgift: 1a. Skriv en rekursiv funktion som gör en rekursiv processlösning, max-element, som returnerar det största elementet ur en lista av tal. Vi kan antaga att listan har minst ett element. (max-element (2-5 3 6 1)) => 6 Vad skiljer en rekursiv processlösning från en iterativ processlösning? 1b. Som uppgift 1a. Skriv en iterativ funktion. 1c. Skriv en funktion med sekvenslösning, max-sekv, som returnerar största värdet i en godtycklig lista med tal. Vi får antaga att alla talen är positiva. Inga punkterade par finns, däremot kan en tom lista förekomma. (max-sekv ((2 3) 5 ((7) () 2))) => 7 1d. Skriv en funktion med binär trädlösning, max-bt, dvs listan representerar ett binärt träd, i vilken vi önskar det största lövet. Punkterade par ingår sålunda i listan. (max-bt ((2. -4). (7. (2. 3)))) => 7
7 Du skall kunna förstå listor i parentesformat och den grafiska representationen. Förstå när delade strukturer uppstår. Förstå skillnaden mellan eq (pekar/objekt-likhet) och equal (värde/innehållslikhet). Kunna ändra pekare med setf. Typisk tentauppgift: Rita upp grafiskt (med consceller och pilar) hur den liststruktur ser ut och vilket värde (i parentesformat) som skapas av (cons (list a b) (c)) (let ((p (list a b))) (cons p p)) (let ((p (cons (a) (b)))) (setf (rest (rest p)) (first p)) (setf (first p) nil) p) Skriv Lisp-uttryck som skapar a b
8 Du skall kunna förstå lambda-uttryck och skriva högre ordningens funktioner. Typiska tentauppgifter: Vad får vi för värde på följande uttryck: (mapcar # (lambda (e) (list e e)) (a b c d)) (mapcar # (lambda (a b) (list b a)) (1 2 3 4) (a b c d)) Skriv en funktion remover som tar en godtycklig lista (ej innehållande punkterade par) och en predikatfunktion fn som skapar en ny lista där de element e, som uppfyller fn(e) är borttagna. (remover ((a 3) 4 (b c (5))) # numberp) => ((a) (b c ()) Skriv en funktion tabort-intervall, som tar en godtycklig lista (ej innehållande punkterade par) med tal och en under och övre gräns, med hjälp av funktionen remover. Element lika med gränserna skall även tas bort. (tabort-intervall ((1 16) 5 20 ((3 10) 25)) 10 20) => ((1) 5 ((3) 25)), dvs tar bort all elementen mellan 10 och 20.
9 Imperativa strukturer. Du skall kunna hantera poster (structures) och arraystrukturer. Skapa, ta ut delar och ändra element med tilldelning. Du skall kunna några repetitionsstrukturer. Typisk tentauppgifter. Du har en arraystruktur, där elementen är poster av typen person. En sådan post skall innehålla namn och ålder. Deklarera posttypen person. Skriv en funktion öka-ålder som i en sådan arraystruktur ökar åldern för varje person med ett givet antal år. Skriv en funktion sortera som sorterar posterna i åldersordning.
10 Makrofunktioner Du skall kunna skriva makrofunktioner, definiera sådana och förstå när de måste användas. Tänk igenom backquote-syntaxen. Makrofunktioner används bl a för: Egen skapad syntax. Då alla arguemten ej skall beräknas. Vissa argument skall beräknas upprepade gånger. Parametrar i anropet skall påverkas - utparametrar. Skapa egna styrstrukturer. Typisk tentauppgifter. I Scheme (en Lisp-dialekt) definierar man funktioner med annan syntax jämfört med Common Lisp enligt följande (define (fn-namn param1 param2... paramk) body1 body2... bodyn) Man vill kunna använda denna syntax i Common Lisp. Hur gör man? Varför måste define definieras som en makro?
11 Du skall förstå interpretatorfunktionerna eval, apply och funcall. Typisk tentauppgift: Vad blir värdet av (eval (list list (list quote list))) (funcall # (lambda (f g) (funcall g f f)) list # list) Övrigt: Du skall förstå vad lexical closure är och hur icke-normala återhopp med catch och throw fungerar. Du skall förstå skillnaden mellan statisk och dynamisk bindning. Du skall kunna lösa svårare strukturella problem med t ex back-tracking-modellen och med induktionsmodellen. Av typen: Skriv en funktion som hittar en väg i ett binärt träd. Skriv en funktion som tar fram alla permutationer av en lista...
12 Kunna förstå programkod. Abstraktion. Du skall kunna läsa och förstå program, kunna avgöra abstrakta nivån contra representationsnivån. Ofta finns det en uppgift där en del kod är givna i en bilaga. Uppgifter kan vara att komplettera funktioner i denna kod, ändra i denna, kod, byta representation etc.
13 På kursens hemsida finns en länk till Tentaarkiv där de senaste tentorna med lösningar finns. Inga hjälpmedel. Om ni inte riktigt kommer ihåg en funktion (namn och parameterordning) så är de ok att ange hur man skall tolka funktionen. Graderade betyg. Möjligheten fanns att via laborationerna och projekt att höja detta betyg. Skriftlig tentamen torsdag 15 dec 8-15. Vi hinner rätta innan jul och förhoppningsvis hinna få det registrerat i LADOK.
14 Checklista på begrepp att kunna inför tentamen Hänvisning till uppgifter ni redovisat från laborationerna. Dessutom finns många fler relvanta övningar från laborationshäftet och exempelsamlingen. - grundläggande Lisp funktioner - skilj på cons, append och list (första duggan!) - funktionsbegreppet definition lambda-uttryck (uppg 2D - traverse, uppg 2E - Pascal s triangel) function - funcall parameterlistor (&rest, &optional, &key) special form makrofunktioner (uppg 6C - setlistq) - lösa repetitiva problem rekursion rekursiv processlösning (uppg 1A, uppg 2B och 2C Sökning i lista, Uppg 3A- potensmängd) iterativ processlösning (div övningar i lab 1) backtracking (uppg 2C - backfind, uppg 3B- Mönstermatchning) iteration (loop, dotimes, dolist...) (uppg 6A - frekvenstabell, uppg 6B - ändra representation) iteratorer (uppg 2D - traverse, almanackan) högre ordningens funktioner (uuppg 2D - traverse, uppg 2E - Pascal s triangel) map-funktioner
15 - algoritmer över datastrukturer sekvenslösningar (uppg 1B - personnummer, uppg 3C - gemensamma tider)) binära träd-lösningar (uppg 2A- logikvärde, uppg 2D - traverse, uppg 5A och 5B - kalkylatorn) - liststrukturen cons - punkterade par grafisk representation delade strukturer - eq strukturändrande funktioner - setf (uppg 6D - elektroniska minnet) kopierande och destruktiva algoritmer append - nconc datastrukturer (uppf 6D - elektroniska minnet) kö, cirkulär struktur - post och arraystruktur (uppg 6A - frekvenstabell, uppg 6B - ändra representation) generaliserade tilldelningen - setf - in- och utmatning - abstraktion (uppg 4 - Almanackan, uppg 5 - Kalkyl) abstrakta datatyper primitiva funktioner recognizer, constructor, selector, iterator sammansättningar - tupel, sekvens, ändlig avbildning representationsobereoende (uppg 6B - ändra representation)
16 - programstrukturer funktioner lokala funktioner - block - labels lokala variabler statiskt återhopp - return/return-from dynamiskt återhopp - catch - throw unwind-protect - beräkningsmodell / LISP-interpretator eval och apply minilisp interpretering - kompilering (lab 5- kalkyl) - omgivningar statisk och dynamisk lexical closure - makrodefinitioner (uppg 6C - setllistq) backquote
17 Vad kan vi förvänta oss framöver i programmeringskurser: Imperativ programmering och Ada (vt1 C1/D1) Mer en klassisk genomgång av programmering med ett kompilerat programmeringsspråk. Innehåller även en grund i C/C++. Begrepp: Stark typning, deklarationer. Hur typer kan skapas och problematik runt detta. Typkontroll av kompilatorn. Proceduren med in- och ut-parametrar. Call-by-reference. Explicit pekarhantering. Undantagshantering. Paket för att dölja representation, för att skapa abstrakt datatyper. Generiska underprogram och paket, för att skapa generellare datatyper. Strukturen av in- och utmatning. Lite om processhantering. Verktyg: Kompilator, länkare och testverktyg Projektuppgift. Examination vid dator.
18 Objektorienterad programmering och Java (ht1 C2/D2) Objektorienterad programmering och metodik. Programbibliotek. Gränssnittprogrammering Orientering om andra objektorienterade språk, speciellt C++. Begrepp: Primitiva typer, objekt Klass, klasshierarki, metoder, arv Abstrakta klasser, interface Typkonverteringar Iteratorer Klassbibliotek, API Större projekt. Parallellt med kursen använder ni Java i Datastrukturer och algoritmer.
19 Datastrukturer och algoritmer (ht1 C2/D2) Systematisk genomgång av olika datastrukturer och algoritmer. Många har ni redan träffat på i denna kurs. Abstrakta datatyper och datastrukturer. Lista, stack, kö, sökträd (finns många olika typer), hashtabell, graf och olika sätt att representera dessa. Algoritmer Sökning och sortering. Hantering av olika typer av träd. Sökning i grafer. Analys av minne och tid. Komplexitet. Paradigmer för design av algoritmer. Laborationer i Java.
20 Data- och programstrukturer (vt2 C2, Dh) Kan ses som en fortsättning på denna första kurs. Baseras på Scheme och följer Abelson-Sussman Structure and interpretation of computer programs. Innehåller: Olika paradigmer och beräkningsmodeller Utöver de som ni hitills gått igenom funktionell, imperativ och objektorienterad programmering tar man upp flera andra: - Strömmar, ickedeterministisk programmering, logikprogrammering - Lat evaluering,olika parameteröverföringsmodeller (call-by-value, call-by-need, call-by-name) - Implementering av språk, Scheme eval-modellen. Scheme i Scheme explicit registermaskin. Scheme i maskinspråk. förklarar hur rekursion, svansrekursion, parameterhantering går till. kompilering av Scheme till registermaskinen/ maskinspråk
21 Sedan finns fler programmeringsorienterade kurser: Processprogrammering och operativsystem WWW-programmeringskurser Avancerad programmering i C++ Programmering i C# och.net Framework Logikprogrammering Designmönster Komponentbaserad programmering Programvarutestning AI programmering Design och programmering av datorspel Programmering av paralelldatorer m fl Dessutom mer programutvecklingsmetodiska kurser: Programutvecklingsmetodik PUM-projektet Avancerad programutvecklingsmetodik Programvaruutveckling med internationella parter
22 Vad är Lisp mest likt idag av nya språk. Troligen Python. (Guido van Rossum) Interpreterat Interaktiv toploop Inbyggda listor Tupler och sekvenser Mängder Dictionaries (tabell med nyckel-värde-par) Lambda-funktioner - lexical closure Högre ordningens funktioner (filter, map, reduce) Iteratorer, generatorer Radindentering ersätter paraneteser, måsvingar Är däremot äkta objektorienterat.
23 Vad är Lisp mest likt idag av nya språk. Även Ruby. (Yukihiro Matsumoto) Interpreterat Dynamiskt typad Interaktiv toploop Inbyggda listor Symboler Tupler och sekvenser Reguljära uttryck Block - kod som kan ges till call (för beräkning) Lambda-funktioner - lexical closure Högre ordningens funktioner (filter, map, reduce) Iteratorer, generatorer Är däremot äkta objektorienterat. Utvidga klasser. Fånga ej definierade metoder.
24 Man arbetar med en ny version av C++ Man planerar att införa under 2011? en ny standard av C++, ny under namnet C++0x. C++ kommer då att innehålla lambda-uttryck [](int x, int y) { return x + y } någon typ av lexical closure Se te x wikipedia under C++0x
25 Microsofts nya språk F# F# är ett multiparadigmspråk för funktionell programmering samt imperativ och objekt-orienterad programmering. Anpassad för Microsofts.Net Framework Har syntaktiska likheter med Haskell. Starkt typat språk, som gör typhärledning, dvs härleder typsignaturen för en funktion. Funktioner är första ordningen dataobjekt, högre ordningens funktioner, lambda-uttryck och closures. Sequence expressions seq { for b in 0.. 25 do if b < 15 then yield b*b } ger värden 0, 1, 4, 25, 36... 225 Syntaxutvidning för att skapa domänspecifika språk.
26 Microsofts nya språk F# Några exempel: (* factorial function *) let rec factorial n = match n with 0 -> 1 _ -> n * factorial (n - 1) Argumenten hanteras vanligen med mönster (pattern matching), som i Haskell, Erlang mfl språk (defun factorial (n) (cond ((eq n 0) 1) (t (* n (factorial (- n 1))))))
27 Microsofts nya språk F# (* Print even fibs *) [1.. 10] > List.map fib > List.filter (fun n -> (n % 2) = 0) > printlist Sekvensering av delarna i ett uttryck. Värder förs över till nästa, som i Unix (ls > out.txt) (printlist (filter (lambda (n) (= (% n 2) 0) (map fib (create-list 1 10)))) (* Same thing, using sequence expressions *) [ for i in 1..10 do let r = fib i if r % 2 = 0 then yield r ] > printlist
28 Vad är fortfarande mest unikt för Lisp? Jag tycker: Programkod är representerat i en datstruktur som språket själv kan hantera. Ingen skillnad på program och data. Möjliggör att kod kan förändras under exekveringen, t ex makro-funktioner. Jfr maskinkod, allt är bitmönster. Ingen skillnad på program och data. S-notationen (= parentesnotationen), dvs den enheltliga sättet att beskriva hierarkiska strukturer. Enkelt att i textuellt format kommunicera program och data. Jfr XML.
29 I XML kan man beskriva data enligt följande: Vad innebär dessa <!DOCTYPE cdcollection [ deklarationer? <!ELEMENT cdcollection (cd*)> <!ELEMENT cd (artist, title, track*)> <!ELEMENT artist (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT track (number, title, length)> <!ELEMENT number (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT length (#PCDATA) ]> <cdcollection> <cd> <artist>lisa</artist> <title>julsånger</title> <track> <number>2</number> <title>god jul</title> <length>3:30</length> </track> <track> <number>5</number> <title>luciasången/title> <length>3:50</length> </track> </cd> </cdcollection>
30 Vad är det egentligen för skillnad på Lisps parentesuttryck (S-uttrycken). (cdcollection (cd (artist Lisa) (title Julsånger) (track (number 2) (title God jul) (length 3:30) ) (trac (number 5) (title Luciasången) (length 3:50) ) ) ) dvs en textuell notation för att beskriva hierarkiska strukturer. Vi använder helt enkelt första elementet som en tagg.
31 Nu kan vi även representera programkod i XML och skriva en XML-programinterpretator / XML abstract machine. Kan kanske se ut så här?? <define> fak <param> n </param> <body> <expression>if <arguments> <predicate>... n = 0... </predicate> <expression> <constant> 0 </constant> </expression> <expression>... n * fak (n - 1) </expression> </arguments> </expression> </body> </define> <calculate> <expression> <function> fak </function> <arguments> <constant> 0 </constant> </arguments> </expression> </calculate>
32 Tentamen: Torsdag 15/12 kl 8-13. Glöm ej att anmäla dig. Inför tentan: Jag ger handledning inför tentamen tisdag 13 dec kl 13-15 i John von Neuman, Hus B, 1 tr Ni frågar, jag förklarar. Ge gärna förslag på frågor i förväg via epost till mig. Slutför laborationsserien. Projektet med dokumentation. Extra labbhandeldning: Se schema och kursens www-sidor.