INF2810: Funksjonell Programmering

Størrelse: px
Begynne med side:

Download "INF2810: Funksjonell Programmering"

Transkript

1 INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013

2 Tema 2 Forrige uke Representasjon av mengder Sorterte lister og binære trær Lokal tilstand og assignment Prosedyrebasert objektorientering

3 Tema 2 Forrige uke Representasjon av mengder Sorterte lister og binære trær Lokal tilstand og assignment Prosedyrebasert objektorientering I dag The whole truth: omgivelser Destruktive listeoperasjoner Data-identitet vs. -ekvivalens

4 Representasjon av mengder: Binærtrær 3 Enda mer effektivt: {1, 3, 5, 7, 9, 11} som binærtre med ordnede noder. Hver node lagrer et element en venstre-gren med mindre elementer en høyre-gren med større elementer

5 Representasjon av mengder: Binærtrær 3 Enda mer effektivt: {1, 3, 5, 7, 9, 11} som binærtre med ordnede noder. Hver node lagrer et element en venstre-gren med mindre elementer en høyre-gren med større elementer Ved søk etter et gitt element x: Hvis x er mindre enn node-oppslaget, søk til venstre. Hvis x er større, søk til høyre. Kan halvere søkerommet i hvert trinn: Logaritmisk vekst; O(log n). Må være litt obs på å holde treet (noenlunde) balansert.

6 Trær som lister og mengdeoperasjoner for binærtrær 4 To abstraksjonsbarrier (abstrakte datatyper) som bygger på hverandre: (define (make-tree entry left right) (list entry left right)) (define (tree-entry tree) (car tree)) (define (tree-left-branch tree) (cadr tree)) (define (tree-right-branch tree) (caddr tree))

7 Trær som lister og mengdeoperasjoner for binærtrær 4 To abstraksjonsbarrier (abstrakte datatyper) som bygger på hverandre: (define (make-tree entry left right) (list entry left right)) (define (tree-entry tree) (car tree)) (define (tree-left-branch tree) (cadr tree)) (define (tree-right-branch tree) (caddr tree)) (define (element-of-set? x set) (cond ((null? set) #f)

8 Trær som lister og mengdeoperasjoner for binærtrær 4 To abstraksjonsbarrier (abstrakte datatyper) som bygger på hverandre: (define (make-tree entry left right) (list entry left right)) (define (tree-entry tree) (car tree)) (define (tree-left-branch tree) (cadr tree)) (define (tree-right-branch tree) (caddr tree)) (define (element-of-set? x set) (cond ((null? set) #f) ((= x (tree-entry set)) #t)

9 Trær som lister og mengdeoperasjoner for binærtrær 4 To abstraksjonsbarrier (abstrakte datatyper) som bygger på hverandre: (define (make-tree entry left right) (list entry left right)) (define (tree-entry tree) (car tree)) (define (tree-left-branch tree) (cadr tree)) (define (tree-right-branch tree) (caddr tree)) (define (element-of-set? x set) (cond ((null? set) #f) ((= x (tree-entry set)) #t) ((< x (tree-entry set)) (element-of-set? x (tree-left-branch set)))

10 Trær som lister og mengdeoperasjoner for binærtrær 4 To abstraksjonsbarrier (abstrakte datatyper) som bygger på hverandre: (define (make-tree entry left right) (list entry left right)) (define (tree-entry tree) (car tree)) (define (tree-left-branch tree) (cadr tree)) (define (tree-right-branch tree) (caddr tree)) (define (element-of-set? x set) (cond ((null? set) #f) ((= x (tree-entry set)) #t) ((< x (tree-entry set)) (element-of-set? x (tree-left-branch set))) ((> x (entry set)) (element-of-set? x (tree-right-branch set)))))

11 Tid og tilstand 5 Så langt ren funskjonell programmering: prosedyrer som funksjonelle (dvs. matematiske) transformasjoner av data; statisk over tid. Semantikken til et uttrykk er uavhengig av hvor og når det brukes. Gir stor grad av gjennomsiktighet (referential transparency).

12 Tid og tilstand 5 Så langt ren funskjonell programmering: prosedyrer som funksjonelle (dvs. matematiske) transformasjoner av data; statisk over tid. Semantikken til et uttrykk er uavhengig av hvor og når det brukes. Gir stor grad av gjennomsiktighet (referential transparency). Fra kapittel 3 i SICP tar vi høyde for at uttrykk (og objekter ) kan inngå i en omgivelse som forandrer seg over tid. Sentrale konsepter: tilstand (state) og tilordning (assignment). Gir oss en form for (prosedyre-basert) objekt-orientering. Viktig teknikk for å organisere programmer: vi kan opprette objekter i programmene våre som tilsvarer entiteter i verden vi ønsker å modellere. Atferden avhenger av egenskaper som kan forandre seg over tid.

13 For eksempel: bankkonto 6 (define (make-withdraw initial) (let ((balance initial)) (lambda (amount) (cond ((>= balance amount) (set! balance (- balance amount)) balance) (else "Insufficient funds")))))? (make-withdraw 100) #<procedure>? (define w1 (make-withdraw 100))? (define w2 (make-withdraw 200))? (w1 50) 50? (w2 50) 150 Vi representerer kontoobjekter som prosedyrer. make-withdraw: En prosedyre for å generere nye konto-objekter. Returnerer en anonym prosedyre som innkapsler sin egen saldo-variabel: w1 og w2 er distinkte objekter, med distinkte lokale tilstandsvariabler. innkapsling kalles gjerne for closure utenfor SICP.

14 Destruktive operasjoner 7 I kapittel 3 i SICP tok vi et stort skritt: Med set! bryter vi med ren funksjonell programmering og introduserer elementer fra imperativ programmering: Verditilordning og tilstandsendring som modifiserer objekter. Kalles i noen sammenhenger fra et funksjonelt perspektiv for destruktive operasjoner. Når vi endrer tilstanden til et objekt destruerer vi det siden det ikke lenger representerer samme verdi. Til nå har vi kunnet tenke på variabler som navn på verdier. Fra nå må vi tenke på variabler som steder man kan lagre verdier. Bankkonto er en muterbar objekt, med både identitet og tilstand.

15 Prosedyre-basert objektorientering og message passing 8 (define (make-account) (let ((current 0)) (define (deposit amount) (set! current (+ current amount))) (define (withdraw amount) (deposit (- amount))) (define (balance) current) (define (dispatch message) (cond ((eq? message deposit) deposit) ((eq? message withdraw) withdraw) ((eq? message balance) balance))) dispatch))

16 Prosedyre-basert objektorientering og message passing 8 (define (make-account) (let ((current 0)) (define (deposit amount) (set! current (+ current amount))) (define (withdraw amount) (deposit (- amount))) (define (balance) current) (define (dispatch message) (cond ((eq? message deposit) deposit) ((eq? message withdraw) withdraw) ((eq? message balance) balance))) dispatch))? (define erik (make-account))? (define oe (make-account))? ((oe deposit) 100)? ((oe balance))

17 Prosedyre-basert objektorientering og message passing 8 (define (make-account) (let ((current 0)) (define (deposit amount) (set! current (+ current amount))) (define (withdraw amount) (deposit (- amount))) (define (balance) current) (define (dispatch message) (cond ((eq? message deposit) deposit) ((eq? message withdraw) withdraw) ((eq? message balance) balance))) dispatch))? (define erik (make-account))? (define oe (make-account))? ((oe deposit) 100)? ((oe balance)) 100? ((erik balance))

18 Prosedyre-basert objektorientering og message passing 8 (define (make-account) (let ((current 0)) (define (deposit amount) (set! current (+ current amount))) (define (withdraw amount) (deposit (- amount))) (define (balance) current) (define (dispatch message) (cond ((eq? message deposit) deposit) ((eq? message withdraw) withdraw) ((eq? message balance) balance))) dispatch))? (define erik (make-account))? (define oe (make-account))? ((oe deposit) 100)? ((oe balance)) 100? ((erik balance)) 0

19 Prosedyre-basert objektorientering og message passing 8 (define (make-account) (let ((current 0)) (define (deposit amount) (set! current (+ current amount))) (define (withdraw amount) (deposit (- amount))) (define (balance) current) (define (dispatch message) (cond ((eq? message deposit) deposit) ((eq? message withdraw) withdraw) ((eq? message balance) balance))) dispatch))? (define erik (make-account))? (define oe (make-account))? ((oe deposit) 100)? ((oe balance)) 100? ((erik balance)) 0 Hvorfor kan vi ikke uten videre forenkle til f.eks. (oe deposit 100)?

20 På sidespor: dotted pairs vs. lister 9 Hvordan Scheme viser cons-celler:? (cons 1 2) (1. 2)? (cons 1 (cons 2 ())) (1 2)? (cons (list 1 2) 3)

21 På sidespor: dotted pairs vs. lister 9 Hvordan Scheme viser cons-celler:? (cons 1 2) (1. 2)? (cons 1 (cons 2 ())) (1 2)? (cons (list 1 2) 3) ((1 2). 3)

22 På sidespor: dotted pairs vs. lister 9 Hvordan Scheme viser cons-celler:? (cons 1 2) (1. 2)? (cons 1 (cons 2 ())) (1 2)? (cons (list 1 2) 3) ((1 2). 3) I bunnen er (1 2 3) en cons-kjede (1. (2. (3. ()))); Er cdr-verdien et par sløyfer Scheme punktum og parentes:. (.

23 På sidespor: dotted pairs vs. lister 9 Hvordan Scheme viser cons-celler:? (cons 1 2) (1. 2)? (cons 1 (cons 2 ())) (1 2)? (cons (list 1 2) 3) ((1 2). 3) I bunnen er (1 2 3) en cons-kjede (1. (2. (3. ()))); Er cdr-verdien et par sløyfer Scheme punktum og parentes:. (.? (1. (2. (3. ())))

24 På sidespor: dotted pairs vs. lister 9 Hvordan Scheme viser cons-celler:? (cons 1 2) (1. 2)? (cons 1 (cons 2 ())) (1 2)? (cons (list 1 2) 3) ((1 2). 3) I bunnen er (1 2 3) en cons-kjede (1. (2. (3. ()))); Er cdr-verdien et par sløyfer Scheme punktum og parentes:. (.? (1. (2. (3. ()))) (1 2 3) Dermed kan vi skrive prosedyrer som tar et variabel antall argumenter: (define (map fn. lists)...)

25 Polyadiske prosedyrer 10 (define (n-ary-append. lists) (define (recurse lists) (if (null? lists) () (append (car lists) (recurse (cdr lists))))) (recurse lists))

26 Polyadiske prosedyrer 10 (define (n-ary-append. lists) (define (recurse lists) (if (null? lists) () (append (car lists) (recurse (cdr lists))))) (recurse lists))? (n-ary-append (1 2) (3 4) (5 6)) ( )

27 Polyadiske prosedyrer 10 (define (n-ary-append. lists) (define (recurse lists) (if (null? lists) () (append (car lists) (recurse (cdr lists))))) (recurse lists))? (n-ary-append (1 2) (3 4) (5 6)) ( ) Men hvorfor trengs det egentlig den indre rekursive prosedyren? (define (n-ary-append. lists) (if (null? lists) () (append (car lists) (n-ary-append (cdr lists)))))

28 Polyadiske prosedyrer 10 (define (n-ary-append. lists) (define (recurse lists) (if (null? lists) () (append (car lists) (recurse (cdr lists))))) (recurse lists))? (n-ary-append (1 2) (3 4) (5 6)) ( ) Men hvorfor trengs det egentlig den indre rekursive prosedyren? (define (n-ary-append. lists) (if (null? lists) () (append (car lists) (n-ary-append (cdr lists))))) Hva er verdien til lists-parameteret i første og andre oppkalling?

29 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar)

30 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar)

31 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3))

32 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3))

33 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3)) #t? (equal? baz (1 (2) 3))

34 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3)) #t? (equal? baz (1 (2) 3)) #f

35 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3)) #t? (equal? baz (1 (2) 3)) #f eq? tester identitet, som i Scheme tolkes som samme sted (i minne). equal? tester strukturell ekvivalens mellom (muligens nøstete) par; equal? kan lett implementeres som en polymorf rekursiv prosedyre.

36 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3)) #t? (equal? baz (1 (2) 3)) #f eq? tester identitet, som i Scheme tolkes som samme sted (i minne). equal? tester strukturell ekvivalens mellom (muligens nøstete) par; equal? kan lett implementeres som en polymorf rekursiv prosedyre.? (define mee baz)? (eq? mee baz)

37 På en annen sidespor: identitet vs. ekvivalens 11? (define foo foo)? (define bar foo)? (eq? foo bar) #t? (eq? foo bar) #f? (define baz (1 2 3))? (eq? baz (1 2 3)) #f? (equal? baz (1 2 3)) #t? (equal? baz (1 (2) 3)) #f eq? tester identitet, som i Scheme tolkes som samme sted (i minne). equal? tester strukturell ekvivalens mellom (muligens nøstete) par; equal? kan lett implementeres som en polymorf rekursiv prosedyre.? (define mee baz)? (eq? mee baz) #t Flere (kalle)navn kan brukes for én og det samme objektet aliasing.

38 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar))))

39 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?

40 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)

41 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)? (eq? erik oe)

42 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)? (eq? erik oe) #f? (equal? erik oe)

43 Hvordan teste for ekvivalens? 12 (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)? (eq? erik oe) #f? (equal? erik oe) #f? (eq? liv oe)

44 Hvordan teste for ekvivalens? (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)? (eq? erik oe) #f? (equal? erik oe) #f? (eq? liv oe) #t? ((oe withdraw) 100)? (eq? liv oe) 12

45 Hvordan teste for ekvivalens? (define (equal foo bar) (cond ((and (number? foo) (number? bar)) (= foo bar)) ((and (pair? foo) (pair? bar)) (and (equal (car foo) (car bar)) (equal (cdr foo) (cdr bar)))) (else (eq? foo bar)))) Men hva med identitet vs. ekvivalens mellom to prosedyrer?? (define erik (make-account))? (define oe (make-account))? (define liv oe)? (eq? erik oe) #f? (equal? erik oe) #f? (eq? liv oe) #t? ((oe withdraw) 100)? (eq? liv oe) #t 12

46 En gang i tid: substitusjonsmodellen 13 Prosedyrer evalueres på samme måte som beskrevet og praktisert tidligere. Først evalueres uttrykkene i argumentposisjon, deretter anvendes funksjonen. Vi kan tenke oss at funksjonsuttrykk skrives om på følgende måte: Hele uttrykket erstattes av prosedyrekroppen i definisjonen. Argumentnavnene i definisjonen erstattes av verdiene til uttrykkene i argumentposisjon. Dette kalles substitusjonsmodellen. Eksempel (define square (lambda (x) (* x x))) (square (+ 2 1)) (square 3) (* 3 3) 9

47 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance))

48 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) Vi må ta hensyn til at første argumentet til set! er spesielt; men ellers kan vi jo bare prøve å bruke den samme oppskriften: ((make-withdraw 25) 20)

49 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) Vi må ta hensyn til at første argumentet til set! er spesielt; men ellers kan vi jo bare prøve å bruke den samme oppskriften: ((make-withdraw 25) 20) ((lambda (amount) (set! balance (- 25 amount)) 25) 20)

50 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) Vi må ta hensyn til at første argumentet til set! er spesielt; men ellers kan vi jo bare prøve å bruke den samme oppskriften: ((make-withdraw 25) 20) ((lambda (amount) (set! balance (- 25 amount)) 25) 20) (set! balance ( )) 25

51 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) Vi må ta hensyn til at første argumentet til set! er spesielt; men ellers kan vi jo bare prøve å bruke den samme oppskriften: ((make-withdraw 25) 20) ((lambda (amount) (set! balance (- 25 amount)) 25) 20) (set! balance ( )) 25 (set! balance 5) 25

52 Substitusjonsmodellen passer ikke med muterbar data 14 (define (make-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) Vi må ta hensyn til at første argumentet til set! er spesielt; men ellers kan vi jo bare prøve å bruke den samme oppskriften: ((make-withdraw 25) 20) ((lambda (amount) (set! balance (- 25 amount)) 25) 20) (set! balance ( )) 25 (set! balance 5) 25 Den lokale variablen balance brukes tre ganger i prosedyrekroppen. Substitueres 2. og 3. bruk av balance samtidig blir resultatet feil.

53 Omgivelsesmodellen kan forklare alt 15 En omgivelse (environment) er en samling av rammer (frames); Hver ramme inneholder bindinger (bindings), dvs. navn, verdi -par; I tilleg har hver ramme en peker til sin omsluttende omgivelse; Prosedyreobjekter er par: prosedyrekoden koblet til en omgivelse.

54 Omgivelsesmodellen kan forklare alt 15 En omgivelse (environment) er en samling av rammer (frames); Hver ramme inneholder bindinger (bindings), dvs. navn, verdi -par; I tilleg har hver ramme en peker til sin omsluttende omgivelse; Prosedyreobjekter er par: prosedyrekoden koblet til en omgivelse.

55 Noen kommentarer til omgivelsesmodellen 16 SICP bruker ramme og omgivelse om hverandre noen steder. Evaluering av uttrykk kan nå defineres i forhold til en omgivelse. define og set! brukes for å etablere eller endre bindinger. Prosedyreoppkalling (og dermed også let) etablerer nye rammer. Rammer nøstes innenfor hverandre og danner så omsluttende rammer. Når et symbol evalueres finnes den nærmeste omsluttende bindingen. Nøstete bindinger for samme navnet overskygger (shadow) hverandre.

56 Repetisjon: omgivelsesmodellen og let 17? (define foo 42)? (let ((x foo) (y 1)) (list x y))

57 Repetisjon: omgivelsesmodellen og let 17? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)

58 Repetisjon: omgivelsesmodellen og let 17? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y))

59 Repetisjon: omgivelsesmodellen og let 17? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)

60 Repetisjon: omgivelsesmodellen og let 17? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y))

61 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y)) error: x undefined 17

62 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((foo 7) (y foo)) (list foo y))? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y)) error: x undefined 17

63 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((foo 7) (y foo)) (list foo y)) (7 42)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y)) error: x undefined 17

64 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((foo 7) (y foo)) (list foo y)) (7 42)? (let ((foo 7)) (let ((y foo)) (list foo y)))? (let ((x foo) (y x)) (list x y)) error: x undefined 17

65 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((foo 7) (y foo)) (list foo y)) (7 42)? (let ((foo 7)) (let ((y foo)) (list foo y))) (7 7)? (let ((x foo) (y x)) (list x y)) error: x undefined 17

66 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y)) error: x undefined? (let ((foo 7) (y foo)) (list foo y)) (7 42)? (let ((foo 7)) (let ((y foo)) (list foo y))) (7 7)? (let* ((foo 7) (y foo)) (list foo y)) 17

67 Repetisjon: omgivelsesmodellen og let? (define foo 42)? (let ((x foo) (y 1)) (list x y)) (42 1)? (let ((x foo) (y foo)) (list x y)) (42 42)? (let ((x foo) (y x)) (list x y)) error: x undefined? (let ((foo 7) (y foo)) (list foo y)) (7 42)? (let ((foo 7)) (let ((y foo)) (list foo y))) (7 7)? (let* ((foo 7) (y foo)) (list foo y)) (7 7) 17

68 Tilbake til innkapsling (1/3) 18 Innkapsling kan nå avmystifiseres på grunnlag av omgivelsesmodellen: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient Funds"))) (define w1 (make-withdraw 100))

69 Tilbake til innkapsling (1/3) 18 Innkapsling kan nå avmystifiseres på grunnlag av omgivelsesmodellen: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient Funds"))) (define w1 (make-withdraw 100)) Kroppen til make-withdraw returnerer et prosedyreobjekt (dvs. par);

70 Tilbake til innkapsling (1/3) 18 Innkapsling kan nå avmystifiseres på grunnlag av omgivelsesmodellen: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient Funds"))) (define w1 (make-withdraw 100)) Kroppen til make-withdraw returnerer et prosedyreobjekt (dvs. par); Oppkallingen av make-withdraw etablerer en ny ramme, som så blir omgivelsen til den anonyme prosedyren som lambda returnerer.

71 Tilbake til innkapsling (1/3) 18 Innkapsling kan nå avmystifiseres på grunnlag av omgivelsesmodellen: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient Funds"))) (define w1 (make-withdraw 100)) Kroppen til make-withdraw returnerer et prosedyreobjekt (dvs. par); Oppkallingen av make-withdraw etablerer en ny ramme, som så blir omgivelsen til den anonyme prosedyren som lambda returnerer.

72 Tilbake til innkapsling (2/3) 19

73 Tilbake til innkapsling (2/3) 19 Innkapsling: balance er kun tilgjengelig i omgivelsen E1, ikke globalt.

74 Tilbake til innkapsling (3/3) 20 Oppkalling av prosedyreobjektet w1 etablerer nok en ny ramme; som nøstes innenfor omgivelsen til w1 (med innkapsulert balance)

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013 Tema 2 Forrige uke Representasjon av mengder Sorterte

Detaljer

INF2810: Funksjonell Programmering. Mengder og lokal tilstand

INF2810: Funksjonell Programmering. Mengder og lokal tilstand INF2810: Funksjonell Programmering Mengder og lokal tilstand Stephan Oepen & Erik Velldal Universitetet i Oslo Kvinnedagen, 2013 Forrige gang 2 Dagens dont 3 Del 1 Litt mer om hierarkisk data. Representasjon

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 2. mars 2017 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 8. mars 2016 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 1. mars 2018 Forrige gang 2 Kode som trær 3 Ved evaluering oversettes kildekoden i et språk først til et

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 26. februar 2015 Forrige gang 2 I dag Vi blar om til kapittel 3 i SICP.

Detaljer

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Muterbare data INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 15. mars 2016 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:

Detaljer

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

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner

Detaljer

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

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner

Detaljer

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon INF2810: Funksjonell Programmering Dataabstraksjon og Trerekursjon Stephan Oepen & Erik Velldal Universitetet i Oslo 15. februar, 2013 Tema 2 Forrige uke Høyere-ordens prosedyrer: Prosedyrer som argumenter

Detaljer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2016 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister

Detaljer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Trær og mengder Erik Velldal Universitetet i Oslo 19. februar 2015 Tema Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler

Detaljer

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

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data. INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til

Detaljer

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

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data. INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til

Detaljer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2017 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer

Detaljer

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

INF2810: Funksjonell Programmering. Lokale variabler. Og trær. INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer

Detaljer

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

INF2810: Funksjonell Programmering. Lokale variabler. Og trær. INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer

Detaljer

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

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer. INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner

Detaljer

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

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer. INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens

Detaljer

Høyere-ordens prosedyrer

Høyere-ordens prosedyrer INF2810: Funksjonell programmering Høyere-ordens prosedyrer Stephan Oepen & Erik Velldal Universitetet i Oslo 8. februar, 2013 Tema 2 Forrige uke Lister og listerekursjon Høyere-ordens prosedyrer Prosedyrer

Detaljer

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

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo INF2810: Funksjonell programmering Rekursjon og lister Stephan Oepen & Erik Velldal Universitetet i Oslo 1. februar, 2013 Agenda 2 Forrige uke Scheme Substitusjonsmodellen Blokkstruktur Predikater Kondisjonale

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 19. april 2016 Tema 2 Forrige uke Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær

Detaljer

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Muterbare data INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 9. mars 2017 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:

Detaljer

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Eksamensforberedelser INF2810: Funksjonell Programmering Eksamensforberedelser Stephan Oepen & Erik Velldal Universitetet i Oslo 24. mai 2013 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen om flest oblig-poeng

Detaljer

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Kommentarer til prøveeksamen Erik Velldal Universitetet i Oslo 1: Grunnleggende (6 poeng)? (define foo '(a b))? (define bar foo)? (set!

Detaljer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 2. februar 2017 Agenda 2 Forrige uke Substitusjonsmodellen og evalueringsstrategier. Blokkstruktur

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: Fredag 5. juni 2015 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider (ikke medregnet denne siden)

Detaljer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Stephan Oepen Universitetet i Oslo 30. mars 2017 Forrige forelesning 2 Mer om (prosedyre)navn, bindinger, og verditilordning Nok en ny abstrakt

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 27. april 2017 Tema 2 Forrige forelesning Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær

Detaljer

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

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2 INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 18. mai 2017 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen

Detaljer

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

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2 INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 18. mai 2017 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen

Detaljer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 5. februar 2015 Agenda Forrige uke Substitusjonsmodellen og evalueringsstrategier.

Detaljer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Erik Velldal Universitetet i Oslo 12. april 2016 Tema Forrige gang Ny datastruktur, ny teknikk: Strømmer

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal Universitetet i Oslo 28. mai 2015 I dag Kort oppsummering Praktisk om eksamen Hvem

Detaljer

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Strømmer INF2810: Funksjonell Programmering Strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 12. april 2013 Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 31. mai 2016 I dag Kort oppsummering Praktisk

Detaljer

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

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell programmering INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 7. mai 2015 Tema Forrige uke SICP 4.1. Structure and interpretation

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 31. mai 2016 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen

Detaljer

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Strømmer INF2810: Funksjonell Programmering Strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 12. april 2013 Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:

Detaljer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Stephan oepen Universitetet i Oslo 6. april 2017 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering I dag Uendelige

Detaljer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Erik Velldal Universitetet i Oslo 12. april 2016 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering Uendelige sekvenser

Detaljer

INF2810: Funksjonell Programmering. Huffmankoding

INF2810: Funksjonell Programmering. Huffmankoding INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Huffmankoding Erik Velldal Universitetet i Oslo 20. februar 2015 Tema I går Trær som lister av lister Trerekursjon Mengder som trær

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur

Detaljer

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Muterbare data INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 9. mars 2017 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur

Detaljer

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

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen & Erik Velldal Universitetet i Oslo 25. januar, 2013 På blokka 2 Forrige uke Introduksjon og oversikt Funksjonell

Detaljer

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

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular

Detaljer

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

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular

Detaljer

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Mer om strømmer INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 5. juni, 2014 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider. Vedlegg: Ingen Tillatte hjelpemidler:

Detaljer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Erik Velldal Universitetet i Oslo 5. april 2016 Forrige forelesning Mer om (prosedyre)navn, bindinger,

Detaljer

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Mer om strømmer INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet

Detaljer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Stephan oepen Universitetet i Oslo 6. april 2017 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering I dag Uendelige

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk

Detaljer

Innlevering 2b i INF2810, vår 2017

Innlevering 2b i INF2810, vår 2017 Innlevering 2b i INF2810, vår 2017 Dette er del to av den andre obligatoriske oppgaven i INF2810. Man kan oppnå 10 poeng for oppgavene i 2b, og man må ha minst 12 poeng tilsammen for 2a + 2b for å få godkjent.

Detaljer

IN2040: Funksjonell programmering. Trær, mengder og huffmankoding

IN2040: Funksjonell programmering. Trær, mengder og huffmankoding IN2040: Funksjonell programmering Trær, mengder og huffmankoding Erik Velldal Universitetet i Oslo 18. september 2019 Tema 2 Forrige uke lambda, let og lokale variabler Dataabstraksjon Lister av lister:

Detaljer

Innlevering 2a i INF2810, vår 2017

Innlevering 2a i INF2810, vår 2017 Innlevering 2a i INF2810, vår 2017 Hovedtematikken denne gang er Huffman-koding, som ble dekket i 6. forelesning (23. februar) og i seksjon 2.3.4 i SICP. Det er viktig å ha lest denne seksjonen før dere

Detaljer

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

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7 Eksamen i HUMIT 2710, Funksjonell programmering, våren 2005 Ingen hjelpemidler er tillatt. Side 1 av 7 Oppgave 1 Rekursjon Fakultetsfunksjonen, her kalt Fak, kan defineres rekursivt

Detaljer

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell programmering: Introduksjon INF2810: Funksjonell programmering: Introduksjon Stephan Oepen & Erik Velldal Universitetet i Oslo 18. januar, 2013 Tema for i dag 2 Introduksjon Praktiske detaljer Pensum Obliger Lærebok Hva skal vi lære?

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk

Detaljer

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Eksamensforberedelser INF2810: Funksjonell Programmering Eksamensforberedelser Stephan Oepen & Erik Velldal Universitetet i Oslo 24. mai 2013 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen om flest oblig-poeng

Detaljer

Eksamen i SLI230, vår 2003.

Eksamen i SLI230, vår 2003. Eksamen i SLI230, vår 2003. Oppgavesettet har 8 sider medregnet denne forsiden. Ingen hjelpemidler er tillatt. Vedlegg: To sider som inneholder en liste over primitiver fra scheme (og simply.scm) samt

Detaljer

Appendiks A Kontinuasjoner

Appendiks A Kontinuasjoner Appendiks A Kontinuasjoner Fra R5RS: "Whenever a Scheme expression is evaluated there is a continuation wanting the result of the expression." Eller med andre ord: En kontinuasjon i et program under utførelse

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 7. juni Tid for eksamen: 14.30 Oppgavesettet er på 5 sider Vedlegg Relevante prosedyrer Tillatte

Detaljer

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell programmering: Introduksjon NF2810: Funksjonell programmering: ntroduksjon Stephan Oepen & Erik Velldal Universitetet i Oslo 18. januar, 2013 Tema for i dag 2 ntroduksjon Praktiske detaljer Pensum Obliger Lærebok Hva skal vi lære?

Detaljer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Stephan Oepen Universitetet i Oslo 2. februar 2016 Agenda 2 Forrige uke Substitusjonsmodellen og evalueringsstrategier Blokkstruktur

Detaljer

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

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon. INF2810: Funksjonell Programmering Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen Universitetet i Oslo 26. januar 2016 På blokka Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

Detaljer

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

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon. INF2810: Funksjonell Programmering Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen Universitetet i Oslo 26. januar 2017 På blokka Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

Detaljer

INF2810: Funksjonell Programmering. Introduksjon

INF2810: Funksjonell Programmering. Introduksjon INF2810: Funksjonell Programmering Introduksjon Stephan Oepen Universitetet i Oslo 19. januar 2019 Nummer 2 2 Erik Velldal Nummer 2 2 Erik Velldal Hver tar halvparten av forelesningene; hyppig bytte frem

Detaljer

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

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven SLI 230 - side 2 av 8 EKSAMENSOPPGAVE - SLI 230 - VÅR 2000 Nedenfor følger eksamensoppgaver i SLI 230. Først om oppgavene Bakerst følger to sider med hjelp slik det er avtalt - liste over primitiver fra

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810, Funksjonell Programmering Eksamensdag: Fredag 10. juni 2016 Tid for eksamen: 14.30 Oppgavesettet er på 5 sider (ekskl.

Detaljer

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Dagens tema Kjøresystemer (Ghezzi&Jazayeri.6,.7) Repetisjon Språk med rekursjon (C3) og blokker (C4) Statisk link Dynamisk allokering (C5) Parameteroverføring 1/5 Repetisjon: Statiske språk uten rekursive

Detaljer

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7) Repetisjon Språk med rekursjon (C3) og blokker (C4) Statisk link Dynamisk allokering (C5) Parameteroverføring 1/25 Forelesning 11 5.11.2003 Repetisjon:

Detaljer

LISP PVV-kurs 25. oktober 2012

LISP PVV-kurs 25. oktober 2012 LISP PVV-kurs 25. oktober 2012 Hva er Lisp? Grunnleggende konsepter Variabler (Pause) Lister Løkker Funksjoner Oversikt over kurset Først: Få tak i en implementasjon av Common Lisp Mange implementasjoner

Detaljer

Informasjonsteori og entropi

Informasjonsteori og entropi Informasjonsteori og entropi Termen entropi tilhører i utgangspunktet termodynamikken, der den, svært forenklet, betegner reduksjon av energipotensialet innenfor et system der det foregår enerigutveksling

Detaljer

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) INF2220: Forelesning 2 Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) REPETISJON: BINÆRE SØKETRÆR 2 Binære søketrær 8 4 12 2 7 9 15 6 11 13 16 For enhver node i et binært søketre

Detaljer

INF2220: Forelesning 2

INF2220: Forelesning 2 INF2220: Forelesning 2 Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) REPETISJON: BINÆRE SØKETRÆR 2 Binære søketrær 8 4 12 2 7 9 15 6 11 13 16 For enhver node i et binært søketre

Detaljer

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

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon. INF2810: Funksjonell Programmering Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen Universitetet i Oslo 26. januar 2017 På blokka 2 Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

Detaljer

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004 Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004 Oppgave 1 For å komme nærmere kvadratroten til et tall fra en foreløpig tilnærming y, kan vi bruke formelen (y + /y)/2. Dette gir grunnlag for

Detaljer

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3))

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3)) Oppgave 1 For å komme nærmere kuberoten (tredjeroten) til et tall x fra en foreløpig tilnærming y, kan vi bruke formelen (2y + x/y 2 )/3. Skriv prosedyrene (nær-nok-kuberot? y x), (nærmere-kuberot y x)

Detaljer

Moderne Funksjonell Programmering i Lisp

Moderne Funksjonell Programmering i Lisp Moderne Funksjonell Programmering i Lisp Lars Tveito 11. mai, 2017 Institutt for Informatikk, University of Oslo Introduksjon Abstract Vi skal utforske programmeringsspråket Clojure, en moderne Lisp-dialekt.

Detaljer

INF2810: Funksjonell Programmering. Introduksjon

INF2810: Funksjonell Programmering. Introduksjon INF2810: Funksjonell Programmering Introduksjon Erik Velldal Universitetet i Oslo 18. januar 2018 Tema for i dag 2 Introduksjon Lærebok Hva skal vi lære? Praktisk informasjon Grupper Obliger Canvas Scheme

Detaljer

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par kan representeres grafiske slik: Som vi ser kan vi bruke cons til å lage par hvis

Detaljer

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b.

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b. Side 1 Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b. (define (f a) (lambda (b) (add a b ))) b. Skriv g, uten å

Detaljer

Informasjonsteori og entropi

Informasjonsteori og entropi Informasjonsteori og entropi Termen entropi tilhører i utgangspunktet termodynamikken, der den, svært forenklet, betegner reduksjon av energipotensialet innenfor et system der det foregår enerigutveksling

Detaljer

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel ) INF2220: Forelesning 1 Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel 4.1-4.3 + 4.6) PRAKTISK INFORMASJON 2 Praktisk informasjon Kursansvarlige Ragnhild Kobro Runde (ragnhilk@ifi.uio.no)

Detaljer

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet

Detaljer

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 6. juni Tid for eksamen: 14.30 Oppgavesettet er på 4 sider pluss vedlegg Tillatte hjelpemiddel: Ingen

Detaljer

Det er ikke tillatt med andre hjelpemidler enn de to sidene som er vedlagt oppgavesettet. Følgende funksjoner er definert og brukes i oppgaven:

Det er ikke tillatt med andre hjelpemidler enn de to sidene som er vedlagt oppgavesettet. Følgende funksjoner er definert og brukes i oppgaven: Eksamen SLI 230 Bakerst ligger to sider med oversikt over standardprosedyrer og spesialformer i Scheme, samt oversikt over prosedyrer fra Simply Scheme og en enkel oversikt over konvertering mellom datatyper

Detaljer