PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Podobné dokumenty
Paradigmata programování II Přednáška 1: Vedlejší efekt

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

Paradigmata programování II Korutiny a nedeterminismus

Paradigmata programování 1

Paradigmata programování II Přednáška 2: Mutace

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

Paradigmata programování 1

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

Paradigmata programování 1

1. Od Scheme k Lispu

Paradigmata programování 1

Přednáška 3. Rekurze 1

PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ

Paradigmata programování II Přednáška 6: Líné vyhodnocování, proudy a kešované vyhodnocování

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Paradigmata programování 2

Základní datové struktury

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

Algoritmizace a programování

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Sdílení dat mezi podprogramy

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Úvod do programovacích jazyků (Java)

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ

Konstruktory a destruktory

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Více o konstruktorech a destruktorech

Lokální definice (1) plocha-kruhu

Funkcionální programování úvod

PB161 Programování v jazyce C++ Přednáška 7

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

typová konverze typová inference

PB161 Programování v jazyce C++ Přednáška 7

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Jazyk C# (seminář 6)

Struktura programu v době běhu

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IB111 Úvod do programování skrze Python Přednáška 13

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Programování v Pythonu

Generické programování

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Jazyk Scheme: jeho syntax a sémantika

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

1. Programování proti rozhraní

Funkcionální programování

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

Datové struktury. alg12 1

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Matematika v programovacích

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Rekurzivní algoritmy

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

DTP Základy programování Úvod do předmětu

Úvod do programovacích jazyků (Java)

Functional and Logic Programming Functional languages

Algoritmy. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna / 39

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

ŘÍKÁME, ŽE FUNKCE JE ČÁSTEČNĚ SPRÁVNÁ (PARTIALLY CORRECT), POKUD KDYŽ JE SPLNĚNA PRECONDITION

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Program a životní cyklus programu

PB161 Programování v jazyce C++ Přednáška 4

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Základy objektové orientace I. Únor 2010

2. lekce Algoritmus, cyklus Miroslav Jílek

Objektově orientované programování

(pracovní verze textu určená pro studenty)

IB111 Programování a algoritmizace. Programovací jazyky

Kolekce, cyklus foreach

Funkcionální programování. Kristýna Kaslová

C# konzole Podíl dvou čísel, podmínka IF

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

5 Rekurze a zásobník. Rekurzivní volání metody

PSK3-9. Základy skriptování. Hlavička

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

CZ.1.07/1.5.00/

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Abstraktní datové typy

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Programování v C++ 2, 4. cvičení

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Programovací jazyk Haskell

Příkazové skripty Procedurální jazyky Lua a ostatní

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Transkript:

KATEDRA INFORMATIKY, P RÍRODOV EDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT Slajdy vytvoril Vilém Vychodil Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 1 / 40

Co je vedlejší efekt? Imperativní rysy pri programování funkcionální programování = zaloené na postupné aplikaci procedur (funkcí) LISP, Scheme, ML, Haskell,... procedurální programování = zaloená na postupném vykonávání príkaz u, které mají vedlejší efekt C, PASCAL, FORTRAN,... Trend: objektove orientované programování funkcionálne objektové = zaloené na generických procedurách CLOS (Common LISP Object System), GOOPS (objektový Scheme) procedurálne objektové = zaloené na zasílání signál u PERL, PYTHON, Java, C++, C],... v etšina soudobých PJ Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 2 / 40

Jaké typy vedlejších efekt u rozeznáváme hodne typ u vstupn e / výstupní operace (n ekteré FJ umí i bez vedlejšího efektu, treba Haskell) zm enou vazby symbolu tím se budeme zabývat dnes destruktivní zmenou datové struktury tím se budeme zabývat príšt e Pripomínáme: FJ je cistý, pokud programátorovi neumonuje vytvorit vedlejší efekt Scheme není cistý (máme define), Haskell je cistý Náš interpret z Lekce 12 byl cistý (ackoliv byl napsán necist e ). vedlejší efekt není ve FJ na škodu, musí se ale umet pouívat Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 3 / 40

Cím se budeme zabývat obohatíme Scheme o nekolik ryze imperativních konstrukt u demonstrujeme na tom rysy imperativních jazyk u Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 4 / 40

Sekvencování príkaz u Speciální forma begin: postupné vyhodnocení výraz u a vrácení výsledku vyhodnocení posledního z nich (begin (+ 1 2) (* 3 4)) zde u máme vedlejší efekt: vytištení císla na obrazovku (begin (display (+ 1 2)) (newline) (* 3 4)) Pozor: (display "Ahoj") vytiskne na obrazovku, ret ezec nelze chápat jako výsledek vyhodnocení, tím je nede novaná hodnota. Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 5 / 40

Sekvencování príkaz u Chování begin vzhledem k prostredím vyhodnocování výraz u probíhá v aktuálním prostredí (define x 100) (begin (define x 10) (* 2 x)) x Z=) 10 Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 6 / 40

následující je pouití begin v novém prostredí ((lambda () (begin (define x 10) (* 2 x)))) x Z=) Chyba: x nemá vazbu prepis predchozího (let () (begin (define x 10) (* 2 x))) x Z=) Chyba: x nemá vazbu Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 7 / 40

T ela procedur obsahují implicitní begin op et se m ueme vrátit ke konceptu jednoho výrazu v tele procedury (define f (lambda (x) (define local (lambda (y) (+ x y))) (local 20))) (define f (lambda (x) (begin (define local (lambda (y) (+ x y))) (local 20)))) (begin) Z=) nede novaná hodnota Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 8 / 40

Pouití pri lad ení (define depth-map (lambda (f l) (cond ((null? l) '()) ((not (list? (car l))) (cons (f (car l)) (depth-map f (cdr l)))) (else (cons (depth-map f (car l)) (depth-map f (cdr l))))))) predchozí kód lze obohatit o sekvence tisknoucí argumenty sledováním hodnot na výstupu je moné odladit proceduru Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 9 / 40

Provedení príkaz u pro kadý prvek seznamu (for-each (lambda (x) (display "Cislo: ") (display x) (newline)) '(10 20 30 40)) Z=) nede novaná hodnota (for-each (lambda (x) x) '(1 2 3)) Z=) nede novaná hodnota (map (lambda (x) x) '(1 2 3)) Z=) (1 2 3) (for-each (lambda (x y z) (newline) (display (list x y z)) (newline)) '(10 20) '(#t #f) '(a b)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 10 / 40

Proceduru for-each snadno ud eláme for-each lze jednoduše naprogramovat (verze pro 1 seznam): všimn ete si pouití if bez alternativního výrazu (define for-each (lambda (f l) (if (not (null? l)) (begin (f (car l)) (for-each f (cdr l)))))) a obecná verze je taky jednoduchá: (define for-each (lambda (f. lists) (if (not (null? (car lists))) (begin (apply f (map car lists)) (apply for-each f (map cdr lists)))))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 11 / 40

Príkaz prirazení Obecné schéma LVALUE := RVALUE : LVALUE... pamet'ové místo (adresa) RVALUE... hodnota Ve Scheme: reprezentován speciální formou set! (set! /symbol. /výraz.) sémantika 1 v hierarchii prostredí vyhledej symbol /symbol., zacni aktuálním (lokálním) prostredím a pokracuj pres jeho rodice sm erem ke globálnímu; 2 pokud /symbol. nemá vazbu v ádném prostredí, zahlas chybu; 3 v opacném prípad e nahrad' vazbu symbolu /symbol. hodnotou vzniklou vyhodnocením /výraz.. Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 12 / 40

srovnej: (define x 100) (let () (define x 10) (+ x 1)) x Z=) 100 versus: (define x 100) (let () (set! x 10) (+ x 1)) x Z=) 10 Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 13 / 40

versus: (define x 100) (let ((x 10)) (set! x (+ x 1)) (+ x 1)) x Z=) 100 Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 14 / 40

Programování s príkazem prirazení cisté rešení ve funkcionálním stylu: (define fib (lambda (n) (let iter ((a 1) (b 1) (i n)) (if (<= i 1) a (iter b (+ a b) (- i 1)))))) V jazycích jako je C, PASCAL, FORTRAN a spol. cyklus Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 15 / 40

Programování s príkazem prirazení int fib (n) int n; { int a = 1, b = 1, c, i; for (i = n; i > 1; i --) { c = b; b = a + b; a = c; } return a; } m ueme otrocky prepsat i ve Scheme, není ale pekné, ani efektivní: Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 16 / 40

(define fib (lambda (n) (define a 1) (define b 1) (define c 'pomocna-promenna) (define i n) (define loop (lambda () (if (> i 1) (begin (set! c b) (set! b (+ a b)) (set! a c) (set! i (- i 1)) (loop))))) (loop) a)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 17 / 40

na druhou stranu v C lze programovat bez vedlejšího efektu: int fib_iter (a, b, i) int a, b, i; { if (i <= 1) return a; else return fib_iter (b, a + b, i - 1); } int fib_wse (n) int n; { return fib_iter (1, 1, n); } Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 18 / 40

Varování Scheme má vše k dispozici k tomu, abychom se na nej mohli dívat jako na plnohodnotný imperativní jazyk, pri praktickém programování ve Scheme by ale m ely prevládat funkcionální rysy. D uvod: vedlejší efekt obrovský zdroj chyb v programech N ekdy se vedlejší efekty hodí. (let ((i 0)) nastav i na 0 (for-each (lambda (x) (display "Index: ") (display i) (display ", prvek: ") (display x) (newline) (set! i (+ i 1))) zvedni i o 1 '(a b c d e f))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 19 / 40

Procedury pracující s globálními symboly globáln e zavedený symbol (define value 0) procedura pracující s globálním symbolem (define inc (lambda (x) (set! value (+ value x)) value)) (inc 10) Z=) 10 (inc 10) Z=) 20 (inc 10) Z=) 30 value Z=) 30 Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 20 / 40

Do casné prekrytí lexikální vazby symbolu Speciální forma fluid-let (fluid-let ((value 200)) (display (inc 10)) zobrazí 210 (newline) (display (inc 10)) zobrazí 220 (newline)) (inc 10)... vrátí se k p uvodní vazbe (let ((value 200)) (display (inc 10)) (newline) (display (inc 10)) (newline)) pracuje s globální vazbou pracuje s globální vazbou Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 21 / 40

Procedury drící si vnitrní stav místo globálního symbolu meníme lokální vazbu symbolu, na kterou není videt zvencí (define inc (let ((value 0)) (lambda (x) (set! value (+ value x)) value))) (inc 5) Z=) 5 (inc 5) Z=) 10 (inc 5) Z=) 15 value Z=) CHYBA: symbol value nemá vazbu Stav (vazba symbolu value) je dren v prostredí vzniku procedury. Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 22 / 40

Procedury drící si vnitrní stav Pozor, následující nefunguje! všimn ete si zám eny lambda a let (define inc (lambda (x) (let ((value 0)) (set! value (+ value x)) value))) Pri pouívání procedur s vedlejším efektem se podstatne h ur ladí u nestací pouze testovat vstupy a výstupy procedury, musíme vdy pocítat s tím, jaký má procedura zrovna vnitrní stav! Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 23 / 40

Na co je treba dát pozor build-list pracující zepredu (define build-list (lambda (n f) (let iter ((i 0)) (if (= i n) '() (cons (f i) (iter (+ i 1))))))) build-list pracující zezadu (define build-list (lambda (n f) (let iter ((i (- n 1)) (aux '())) (if (< i 0) aux (iter (- i 1) (cons (f i) aux)))))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 24 / 40

Na co je treba dát pozor Predchozí dve verze build-list byly z funkcionálního hlediska nerozlišitelné. Po zavedení vedlejšího efektu ji tak tomu ale není. následující procedura ignoruje všechny argumenty a pricítá jednicku (define inc1 (let ((value 0)) (lambda args (set! value (+ value 1)) value))) z funkcionálního pohledu jsou obe verze build-list nerozlišitelné (build-list 10 (lambda (x) x)) ; (0 1 2 3 4 5 6 7 8 9) m ueme je ale odlišit pomocí vedlejšího efektu (build-list 10 inc1) Z=) (1 2 3 4 5 6 7 8 9 10) Z=) (10 9 8 7 6 5 4 3 2 1) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 25 / 40

Procedury generující procedury s vnitrním stavem procedura (bez argumentu), která vrací proceduru jednoho argumentu reprezentující jeden cítac (jednu instanci cítace) (define make-inc (lambda () (let ((value 0)) (lambda (x) (set! value (+ value x)) value)))) (define i (make-inc)) (define j (make-inc)) (define k (make-inc)) i Z=) #<procedure> první cítac j Z=) #<procedure> druhý cítac k Z=) #<procedure> tretí cítac Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 26 / 40

Procedury generující procedury s vnitrním stavem (i 1) Z=) 1 (i 1) Z=) 2 (i 1) Z=) 3 (j 5) Z=) 5 (j 5) Z=) 10 (j 5) Z=) 15 (j 0) Z=) 15 (k 10) Z=) 10 (k 20) Z=) 30 (k 0) Z=) 30 Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 27 / 40

nová verze map, který spolu s prvkem predává i jeho index vy e²ili jsme pomocí map a procedury vyuºívající zm nu stavu (define map-index (lambda (f l) (let ((i -1)) (map (lambda (x) (set! i (+ i 1)) (f i x)) l)))) (map-index cons '(a b c d e)) Z=) ((0. a) (1. b) (2. c) (3. d) (4. e)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 28 / 40

v predchozí ukázce jsme tiše predpokládali, e map funguje odpredu pokud se zmení samotný map, naše rešení prestane fungovat ukázková verze map, která pracuje zezadu (define map (lambda (f l) (let iter ((l (reverse l)) (aux '())) (if (null? l) aux (iter (cdr l) (cons (f (car l)) aux)))))) (map-index cons '(a b c d e)) Z=) ((4. a) (3. b) (2. c) (1. d) (0. e)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 29 / 40

Reentrantní procedury Procedura se nazývá reentrantní, pokud m ue být prerušena behem jejího vykonávání (vyhodnocování tela v prípad e Scheme) a pak bezpecn e vyvolána znovu predtím, ne to predchozí vykonávání skoncí. To prerušení m ue být zp usobeno treba skokem, nebo vyvoláním (aplikací v prípad e Scheme). Pozn. Toto se ben e d eje pri pouití rekurze. Následující procedura není reentrantní: (define length (let ((delka 0)) (lambda (list) (set! delka 0) (for-each (lambda(x) (set! delka (+ delka 1))) list) delka))) Tu se nám ale zatím nepodarí vyvolat tak, aby se problém projevil. Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 30 / 40

Jiný príklad: reverse-map pro jeden seznam. (define reverse-map1 (let ((vysledek ())) (lambda (f l) (set! vysledek ()) (for-each (lambda (x) (set! vysledek (cons (f x) vysledek))) l) vysledek))) Tady u stací pouít n eco jako: (reverse-map1 (lambda(x) (reverse-map1 - x)) '((1) (2 3) (4))) Tedy: nezneuívat vnitrní stav u procedur, které bychom rádi meli reentratní. Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 31 / 40

Procedury sdílející tý stav vytvorení predikátu, který si pamatuje s jakými hodnotami byl volán (define make-pred (lambda (pred?) (let ((called-with-values '())) `(,(lambda (x y) (set! called-with-values (cons (cons x y) called-with-values)) (pred? x y)),(lambda () (reverse called-with-values)))))) (define p (make-pred <=)) ((car p) 10 20) Z=) #t ((car p) 20 30) Z=) #t ((car p) 30 20) Z=) #f ((cadr p)) Z=) ((10. 20) (20. 30) (30. 20)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 32 / 40

Pouití lze vid et, jak mergesort postupn e porovnává prvky: (let* ((pred (make-pred <=)) (new-pred? (car pred)) (get-called (cadr pred))) (display (mergesort '(4 2 8 5 6 4 5 3 5 8) new-pred?)) (newline) (get-called)) nebo quicksort: (let* ((pred (make-pred <=)) (new-pred? (car pred)) (get-called (cadr pred))) (display (quicksort '(4 2 8 5 6 4 5 3 5 8) new-pred?)) (newline) (get-called)) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 33 / 40

Jednoduchý objektový systém Objektové paradigma (zabývá se jím celý tretí semestr PP) my se jím nebudeme prímo zabývat základní myšlenka: programátor spravuje systém element u (objekt u), které mají sv uj stav; výpocetní proces v OO jazyku je sloen ze vzájemné interakce objekt u a zm en jejich stavu (nejznámejší objektové systémy jsou zaloeny na zasíláni (emisi) signál u a jejich príjmu (pomoci slot u), tzv. message-passing style of programming) N ekteré problémy se pomocí OO reší pohodlne napr. okna, tlacítka a jiné prvky GUI mají sv uj prirozený stav, lze je chápat jako objekty v terminologii OO. Ukáeme jednoduchý objektový systém umonující vytvárení instancí to jest element u jednoho typu, které mají vnitrní stav a komunikují s vnejším sv etem pomocí signál u Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 34 / 40

(define stack ;; data (vnitrní stav objektu) (let ((stack '()) (depth 0)) (define is-empty? (lambda ()...)) (define push (lambda (elem)...)) (define pop (lambda ()...)) (define top (lambda ()...)) ;; dispatcher: aktivuje jednotlivé procedury podle jmen signál u (lambda (signal. args) (cond ((equal? signal 'empty?) (is-empty?)) ((equal? signal 'push) (push (car args))) ((equal? signal 'pop) (pop)) ((equal? signal 'top) (top)) (else (error "unknown signal")))))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 35 / 40

príklad pouití (stack 'push 10) (stack 'top) Z=) 10 (stack 'push 20) (stack 'top) Z=) 20 (stack 'push 30) (stack 'top) Z=) 30 (stack 'empty?) Z=) #f (stack 'pop) (stack 'pop) (stack 'pop) (stack 'empty?) Z=) #t (stack 'pop) Z=) chyba, zásobník je prázdný Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 36 / 40

;; je zásobník prázdný? (define is-empty? (lambda () (= depth 0))) ;; pridej prvek na vrchol zásobníku (define push (lambda (elem) (set! stack (cons elem stack)) (set! depth (+ depth 1)))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 37 / 40

;; odstra n prvek z vrcholu zásobníku (define pop (lambda () (if (is-empty?) (error "cannot perform `pop', stack is empty") (begin (set! stack (cdr stack)) (set! depth (- depth 1)))))) ;; vrat' prvek nacházející se na vrcholu zásobníku (define top (lambda () (if (is-empty?) (error "stack is empty") (car stack)))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 38 / 40

(define make-stack (lambda () (let ((stack '()) (depth 0)) (define is-empty? (lambda ()...)) (define push (lambda (elem)...)) (define pop (lambda ()...)) (define top (lambda ()...)) (lambda (signal. args) (cond ((equal? signal 'empty?) (is-empty?)) ((equal? signal 'push) (push (car args))) ((equal? signal 'pop) (pop)) ((equal? signal 'top) (top)) (else (error "unknown signal"))))))) Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 39 / 40

(define s1 (make-stack)) (define s2 (make-stack)) (s1 'push 10) (s2 'push 'a) (s1 'push 20) (s2 'push 'b) (s1 'push 30) (s1 'top) Z=) 30 (s2 'top) Z=) b Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší efekt 40 / 40