Dagens föreläsning. - Vad skall vi kunna inför den skriftliga examinationen? - Vad skall vi ta med oss till andra kurser.

Relevanta dokument
Dagens föreläsning Programmering i Lisp Fö 5

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Tentamen i. TDDC67 Funktionell programmering och Lisp

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

TDDC74 Programmering, abstraktion och modellering. Tentamen

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Tentamen i. TDDA 69 Data och programstrukturer

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Rekursiva algoritmer sortering sökning mönstermatchning

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Dagens föreläsning. Modeller för programmeringsspråk. - Olika modeller programspråk Interpretator - kompilator. - Syntax - semantik.

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering DUGGA 2

LABORATION 1. Inledande Lisp - rekursion

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Introduktionsmöte Innehåll

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

EDAA01 Programmeringsteknik - fördjupningskurs

TDDC74 Lab 02 Listor, sammansatta strukturer

Programmeringsteknik II

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Sista delen av kursen

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Exempel på typer av datorspråk EXCEL

DD1361 Programmeringsparadigm. Carina Edlund

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Abstrakta datatyper. Dagens föreläsning. Abstract data types (ADT)

Dagens föreläsning. TDDC67 Funktionell programmering och Lisp Fö 8 och 9

Program & programmering

Exempel på typer av datorspråk EXCEL

Introduktion till Datalogi DD1339. Föreläsning 1 8 sept 2014

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

Föreläsning 14 Innehåll

Kursplanering Objektorienterad programmering

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Imperativ programmering

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Funktionell programmering DD1361

Uppgift 6A - Frekvenstabell

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

Procedurer och villkor

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Programmering II (ID1019)

TDDC74 Programmering, abstraktion och modellering DUGGA 3

Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15-13:15

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Objektorienterad programmering

Introduktion till programmering. Programspråk och paradigmer

TDDE44 Programmering, grundkurs

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

TDDC74 - Lektionsmaterial C

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Deklarationer/definitioner/specifikationer

SMD 134 Objektorienterad programmering

TDP002 - Imperativ programmering

Länkade strukturer, parametriserade typer och undantag

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

allt.cl Page 1 of 17 Date: torsdag 7 december 2006

Översikt. Programmering tillämpningar och datastrukturer. Vad kursen täcker. Lärare. Rekommenderad litteratur. Kursmål 729G58 (HKGBB7)

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

TDDC74 Programmering: Abstraktion och modellering Dugga 1, kl 14-16

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Föreläsning 2 Datastrukturer (DAT037)

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

TDDC74 Programmering: Abstraktion och modellering Datortenta

Våra enkla funktioner eller procedurer

Sökning och sortering

Föreläsning 15: Repetition DVGA02

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Föreläsning 6: Introduktion av listor

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

6. Ge korta beskrivningar av följande begrepp a) texteditor b) kompilator c) länkare d) interpretator e) korskompilator f) formatterare ( pretty-print

Transkript:

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.