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

Podobné dokumenty
PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

Paradigmata programování II Korutiny a nedeterminismus

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

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

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

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

Paradigmata programování 1

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

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Paradigmata programování 1

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

Přednáška 3. Rekurze 1

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

1. Od Scheme k Lispu

Integrování jako opak derivování

Skalární sou in. Úvod. Denice skalárního sou inu

Limity funkcí v nevlastních bodech. Obsah

Základní stavební prvky algoritmu

Paradigmata programování 1

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

LISP Definice funkcí

T i hlavní v ty pravd podobnosti

Derivování sloºené funkce

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.

Paradigmata programování 2

Algoritmizace a programování

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

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]

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Sazba zdrojových kód. Jakub Kadl ík

Paradigmata programování 1

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

Binární operace. Úvod. Pomocný text

2. Ur íme sudost/lichost funkce a pr se íky s osami. 6. Na záv r na rtneme graf vy²et ované funkce. 8x. x 2 +4

Algoritmizace a programování

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

awk programovatelný filtr

Krajská hospodářská komora Střední Čechy. Pravidla soutěže. Poznáváme firmy ve středních Čechách. 1. Pořadatel soutěže. 2. Termín konání soutěže

Transformace ER SQL. Ing. Michal Valenta PhD. Databázové systémy BI-DBS ZS 2010/11, P edn. 9

Fyzikální praktikum 3

Funkcionální programování úvod

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

Pr b h funkce I. Obsah. Maxima a minima funkce

Základní datové struktury

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi

Konceptuální modelování

Vektory. Vektorové veli iny

Prezentace. Ing. Petr V elák 6. b ezna 2009

Pravd podobnost a statistika - cvi ení. Simona Domesová místnost: RA310 (budova CPIT) web:

P íklad 1 (Náhodná veli ina)

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

Modelování v elektrotechnice

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

Paradigmata programování 1 poznámky k přednášce. 3. Rekurze 1

Vektor náhodných veli in - práce s více prom nnými

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Státnice - Rekurzivní a rekurzivn spo etné mnoºiny

Databázovéa informačnísystémy NÁVRH IMPLEMENTACE 2 KONZISTENCE DATABÁZE

na za átku se denuje náhodná veli ina

Programování 1. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Reálná ísla a posloupnosti Jan Malý

e²ení systém lineárních rovnic pomocí s ítací, dosazovací a srovnávací metody

Seminá e. Ing. Michal Valenta PhD. Databázové systémy BI-DBS ZS 2010/11, sem. 1-13

Vzorové e²ení 4. série

Obsah. Zpracoval Ctirad Novotný pro matmodel.cz.

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Cesta kolem světa za 80 dní. Cesta kolem světa pro 2-6 hráčů od 10 let od Michaela Rienecka, Kosmos 2004

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 jazyce JavaScript

1. (18 bod ) Náhodná veli ina X je po et rub p i 400 nezávislých hodech mincí. a) Pomocí ƒeby²evovy nerovnosti odhadn te pravd podobnost

Jazyk Scheme: jeho syntax a sémantika

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Státní maturita 2010 Maturitní generálka 2010 Matematika: didaktický test - základní úrove obtíºnosti MAGZD10C0T01 e²ené p íklady

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

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

Příloha č. 54. Specifikace hromadné aktualizace SMS-KLAS

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Kelvin v kapkový generátor

Práce s daty. 2. února Do tohoto adresá e stáhn te ze stránek soubory data.dat a Nacti_data.sci.

ízení Tvorba kritéria 2. prosince 2014

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

ZATÍŽENÍ SNĚHEM A VĚTREM

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ě

NÁKUP CNC BRUSKY NA KULATO

Jevy, nezávislost, Bayesova v ta

Rovnice a nerovnice. Posloupnosti.

Zápis 19. veřejného zasedání Zastupitelstva obce Libá, konaného dne v hod. v kanceláři OÚ Libá.

Platební styk (mezibankovní, klientský) Jitka Vachtová 28. íjna 2011

Adresa p íslušného ú adu. Ú ad:... Ulice:... PS, obec:...

Regionální rady regionu soudržnosti Severovýchod pro období ukončování ROP Severovýchod

pokud A Rat(M), pak také A Rat(M).

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

ŔÍZENÍ TRAKTORU NA SOUVRATI DLE INDIVIDUÁLNÍHO PROGRAMU (JAW125000

Rekurzivní algoritmy

Programování v Pythonu

21. Číslicový měřicí systém se sběrnicí IEEE 488 (základní seznámení)

Ergodické Markovské et zce

Transkript:

KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 1 / 44

Motivace B hem posledních dvou semestr jsme ukázali, ºe s procedurami a makry je moºné pracovat jako s daty. Dále jsme ukázali, ºe výpo et lze ídit daty (streamy). Nyní ukáºeme, ºe s výpo etním asem, historií a budoucností výpo tu je moºné pracovat jako s daty. Budeme pot ebovat t i fundamentální pojmy 1 Kontext procedura jednoho argumentu reprezentující výpo et, který nastane okamºit po vyhodnocení jistého výrazu 2 Úniková procedura procedura, po jejíº aplikaci se ukon í zbylý výpo et a jako výsledek je okamºit vrácena hodnota její aplikace 3 Aktuální pokra ování neboli kontinuace je úniková procedura vytvo ená z kontextu aktuálního výrazu (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 2 / 44

Motivace O co jde? aktuální pokra ování analogie p íkazu skoku oproti skoku je v²ak MNOHEM mocn j²í umoºní nám vytvá et mnoºství typ nelokálních skok umoºní (do jisté míry) zhmotnit budoucnost výpo tu a manipulovat s ní jako s daty (nap íklad ji vyvolat v okamºiku, kdy uº budoucí výpo et prob hl v jistém smyslu se tedy vrátíme do minulosti). asem vytvo íme korutiny podprogramy, které se budou vzájemn p epínat paralelní systém soub ºný b h n kolika výpo t nedeterministické operátory povede na programy, které budou schopny samy hledat e²ení problému pouze na základ jeho popisu a mnohem víc... aktuální pokra ování doména jazyka Scheme (ostatní PJ mají jen trapné náhraºky, t eba standard POSIX denuje longjmp... slabý odvar) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 3 / 44

POJEM 1: Kontext Neformáln : Kontext je zhmotn ní zbytku výpo tu, který by byl zahájen okamºit po vyhodnocení n jakého podvýrazu P íklady: kontext podvýrazu (/ 25 x) ve výrazu (+ 2 (* 3 (/ 25 x))) je výpo et, který prob hne po vyhodnocení (/ 25 x) v (+ 2 (* 3 (/ 25 x))), to jest: hodnota vzniklá vyhodnocením (/ 25 x) bude násobena íslem 3 a tento výsledek bude p i ten k 2. kontext podvýrazu * ve výrazu (+ 2 (* 3 (/ 25 x))) je výpo et, který nejprve otestuje, zda-li je výsledná hodnota (vzniklá vyhodnocením *) procedura, pokud ne, kon í se chybou; pokud ano, je tato procedura aplikována na 3 a výsledek vyhodnocení (/ 25 x); k výsledku aplikace je poté je²t p i teno 2. (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 4 / 44

Je²t n co o kontextu Pojem: program s dírou (hole 2) díra p edstavuje (nespecikovaný) výraz, o jehoº kontext se zajímáme (+ 2 (* 3 (/ 25 5))) (+ 2 (* 3 2)) (+ 2 (* 2 (/ 25 5))) (+ 2 (2 3 (/ 25 5))) Formáln : Kontext je procedura jednoho argumentu reprezentující výpo et, který by nastal po dosazení skute né hodnoty místo díry Pro p edchozí p íklady si lze p edstavit jako procedury vzniklé vyhodnocením následujících -výraz (lambda (2) (+ 2 (* 3 2))) (lambda (2) (+ 2 (* 2 (/ 25 5)))) (lambda (2) (+ 2 (2 3 (/ 25 5)))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 5 / 44

POJEM 2: Úniková procedura Procedura se nazývá úniková procedura, pokud je-li aktivována, tak zp sobí okamºité p eru²ení vykonávání zbytku výpo tu a výsledkem vyhodnocení (celého vstupního výrazu, ve kterém byla pouºita) je práv výsledek její aplikace Budeme p edpokládat, ºe máme k dispozici proceduru escaper, která pro danou proceduru vrátí tutéº proceduru, která ale bude úniková (posléze ukáºeme, ºe escaper lze ve Scheme naprogramovat) * Z=) procedura násobení (escaper *) Z=) úniková procedura násobeni Pouºití na top-level je stejné (* 10 20) Z=) 200 ((escaper *) 10 20) Z=) 200, av²ak: (+ 2 (* 10 20)) Z=) 202 (+ 2 ((escaper *) 10 20)) Z=) 200 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 6 / 44

Dal²í p íklad únikové funkce (define p (escaper (lambda (x) (if (even? x) x (- x))))) p íklad pouºití: (p 10) Z=) 10 (p 11) Z=) -11 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 7 / 44

(define p (escaper (lambda (x) (if (even? x) x (- x))))) (define test (lambda (x) (if (= 1 (p x)) tohle-nikdy-neprobehne tohle-taky-ne))) Demonstrace toho, ºe if nikdy neprob hne (test 10) Z=) 10 (test 11) Z=) -11 (eval `(test 10)) Z=) 10 (eval `(test (+ 5 6))) Z=) -11 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 8 / 44

POJEM 3: Aktuální pokra ování (kontinuace) Jazyk Scheme dává k dispozici proceduru call/cc, pouºití: (call/cc / receiver.), kde / receiver. (p íjemce) musí být procedura jednoho argumentu. (call/cc je zkratka pro call-with-current-continuation) P i volání (call/cc / receiver.) se provede: 1 Vytvo í se kontext (call/cc / receiver.) v aktuáln vyhodnocovaném výrazu 2 / receiver. je zavolán s argumentem (který nazýváme aktuální pokra ování neboli kontinuace) jímº je procedura vzniklá vyhodnocením (escaper / kontext.) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 9 / 44

Takºe p i pouºití (call/cc (lambda (f) (f ) )) bude uvnit na f navázána úniková procedura. Tuto únikovou proceduru m ºeme aktivovat s jedním argumentem. Pokud se tak stane, je okamºit p eru²eno vyhodnocování dal²ího kódu v receiveru a bude se pokra ovat vyhodnocováním kontextu (call/cc ) s hodnotou se kterou bylo aplikováno f. (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 10 / 44

(* 2 (+ 3 (/ 25 5))) Z=) 16 Takºe nap íklad (f není pouºito) (* 2 (call/cc (lambda (f) (+ 3 (/ 25 5))))) Z=) 16 p edchozí si lze p edstavit: (* 2 ((lambda (f) (+ 3 (/ 25 5))) (escaper (lambda (2) (* 2 2))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 11 / 44

Dal²í p íklad: (* 2 (call/cc (lambda (f) (+ 3 (f 5))))) Z=) 10 si lze p edstavit: (* 2 ((lambda (f) (+ 3 (f 5))) (escaper (lambda (2) (* 2 2))))) u p edchozího: (+ 3... se neuplatní, dojde k p eru²ení výpo tu a vyvolá se aktuální pokra ování (násobení dvojkou) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 12 / 44

(+ 1 (call/cc (lambda (f) 2))) Z=) 3 (+ 1 (call/cc (lambda (f) (f 2)))) Z=) 3 (+ 1 (call/cc (lambda (f) (if (even? (f 2)) 100 200)))) Z=) 3 (+ 1 (call/cc (lambda (f) (* 2 (call/cc (lambda (g) (f (g 20)))))))) Z=) 41 (+ 1 (call/cc (lambda (f) (* 2 (call/cc (lambda (g) (g (f 20)))))))) Z=) 21 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 13 / 44

Aplikace okamºité opu²t ní rekurze (výskok z rekurze) Modelový p íklad ;; procedura realizující sou in ísel v seznamu (define list-product (lambda (l) (if (null? l) 1 (* (car l) (list-product (cdr l)))))) (list-product '(1 2 3 4 5)) Z=) 120 chceme zefektivnit výpo et násobení ehokoliv nulou je nula (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 14 / 44

p idání limitní podmínky pro nulu má nevýhodu, fáze odvíjení bude po ád probíhat (define list-product (lambda (l) (cond ((null? l) 1) ((= (car l) 0) 0) (else (* (car l) (list-product (cdr l))))))) ;; rekurzivní verze procedury pouºívající call/cc (define list-product (lambda (l) (call/cc (lambda (exit) (let proc ((l l)) (cond ((null? l) 1) ((= (car l) 0) (exit 0)) (else (* (car l) (proc (cdr l)))))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 15 / 44

;; iterativní verze procedury (define list-product (lambda (l) (let iter ((l l) (accum 1)) (if (null? l) accum (iter (cdr l) (* accum (car l))))))) ;; iterativní verze s okamºitým opu²t ním (bez call/cc) (define list-product (lambda (l) (let iter ((l l) (accum 1)) (cond ((null? l) accum) ((= (car l) 0) 0) (else (iter (cdr l) (* accum (car l)))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 16 / 44

Poznámka V p edchozím p ípad jsme zefektivn ní výpo tu pomocí okamºitého opu²t ní um li ud lat bez call/cc, pouze jsme rekurzivní proceduru nahradili její iterativní variantou (iteraci lze kdykoliv okamºit p eru²it, protoºe se nebuduje ºádný nedokon ený výpo et). Otázka: Není call/cc jen zbyte ný luxus? Odpov : není, p epis rekurze pomocí iterace je n kdy hodn t ºký (nap íklad iterativní verze hloubkov rekurzivních procedur) viz následující odstra²ující p íklad (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 17 / 44

;; testuj vztah dvou seznam do hloubky (define atom-prop? (lambda (aprop? l1 l2) (cond ((and (null? l1) (null? l2)) #t) ((and (pair? l1) (pair? l2)) (and (atom-prop? aprop? (car l1) (car l2)) (atom-prop? aprop? (cdr l1) (cdr l2)))) ((and (not (pair? l1)) (not (pair? l2))) (aprop? l1 l2)) (else #f)))) P íklad pouºití: (atom-prop? <= '(1 (2 (3) 4)) '(2 (3 (4) 5))) Z=) #t (atom-prop? <= '(1 (2 (3) 4)) '(2 (3 (1) 5))) Z=) #f (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 18 / 44

;; nebo bez pomocí cond (jen s pouºitím and a or) (define atom-prop? (lambda (aprop? l1 l2) (or (and (null? l1) (null? l2)) (and (pair? l1) (pair? l2) (atom-prop? aprop? (car l1) (car l2)) (atom-prop? aprop? (cdr l1) (cdr l2))) (and (not (pair? l1)) (not (pair? l2)) (aprop? l1 l2))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 19 / 44

;; efektivn j²í verze s okamºitým opu²t ním výpo tu (define atom-prop? (lambda (aprop? l1 l2) (call/cc (lambda (exit) (let test ((l1 l1) (l2 l2)) (or (and (null? l1) (null? l2)) (and (pair? l1) (pair? l2) (test (car l1) (car l2)) (test (cdr l1) (cdr l2))) (and (not (pair? l1)) (not (pair? l2)) (aprop? l1 l2)) (exit #f))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 20 / 44

p edchozí procedur lze p epsat i iterativn, ale je to sloºité navíc se pon kud vytrácí efektivita, protoºe rekurzivní volání procedury nahrazujeme komplikovanou manipulací se zásobníky (define atom-prop? (lambda (aprop? l1 l2) (let test ((s1 '()) ; pomocný zásobník pro l1 (s2 '()) ; pomocný zásobník pro l2 (l1 l1) (l2 l2)) (cond ((and (null? s1) (null? s2) (null? l1) (null? l1)) #t) ((and (null? s1) (null? s2) (not (null? l1)) (not (null? l2))) (test (cons (car l1) s1) (cons (car l2) s2) (cdr l1) (cdr l2))) ((and (null? s1) (null? s2)) #f) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 21 / 44

. ((or (null? s1) (null? s2)) #f) ((and (null? (car s1)) (null? (car s2))) (test (cdr s1) (cdr s2) l1 l2)) ((and (pair? (car s1)) (pair? (car s2))) (test (cons (caar s1) (cons (cdar s1) (cdr s1))) (cons (caar s2) (cons (cdar s2) (cdr s2))) l1 l2)) ((or (pair? (car s1)) (pair? (car s2))) #f) ((aprop? (car s1) (car s2)) (test (cdr s1) (cdr s2) l1 l2)) (else #f))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 22 / 44

(atom-prop? <= '((1 2) (3)) '((2 3) (4))) Z=) #t [] [] ((1 2) (3)) ((2 3) (4)) [(1 2)] [(2 3)] ((3)) ((4)) [1 (2)] [2 (3)] ((3)) ((4)) [(2)] [(3)] ((3)) ((4)) [2 ()] [3 ()] ((3)) ((4)) [()] [()] ((3)) ((4)) [] [] ((3)) ((4)) [(3)] [(4)] () () [3 ()] [4 ()] () () [()] [()] () () [] [] () () (atom-prop? <= '((1 2) (3)) '((1 1) (4))) Z=) #f [] [] ((1 2) (3)) ((1 1) (4)) [(1 2)] [(1 1)] ((3)) ((4)) [1 (2)] [1 (1)] ((3)) ((4)) [(2)] [(1)] ((3)) ((4)) [2 ()] [1 ()] ((3)) ((4)) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 23 / 44

Úschova únikových funkcí a jejich pozd j²í pouºití Kontinuace jsou (únikové) procedury Kontinuace = elementy prvního ádu (call/cc (lambda (f) f)) Z=) #<continuation> (procedure? (call/cc (lambda (f) f))) Z=) #t Receiver v následujícím výrazu nejprve naváºe kontinuaci na globální symbol blah (define blah #f) (* 2 (call/cc (lambda (f) (set! blah f) 30))) Z=) 60 Kontinuaci v blah je moºné dál pouºívat (blah 1) Z=) 2 (blah 2) Z=) 4 (blah 3) Z=) 6 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 24 / 44

Úschova únikových funkcí a jejich pozd j²í pouºití (begin (display "JEDNOU") (newline) (* 2 (call/cc (lambda (f) (set! blah f) 30)))) Z=) 60 a vytiskne se JEDNOU (blah 10) Z=) 20 (na obrazovku se nic netiskne) (* 2 (let ((result (call/cc (lambda (f) (set! blah f) 30)))) (display "POKAZDE") (newline) result)) Z=) 60 (blah 10) Z=) 20 a vytiskne se POKAZDE (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 25 / 44

Úschova únikových funkcí a jejich pozd j²í pouºití Zajímavý efekt (* 2 (call/cc (lambda (f) (set! blah f) zde-udelame-zamerne-chybu))) Z=) Error Chyba nastala aº po navázání blah, takºe: (blah 10) Z=) 20 (je v po ádku) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 26 / 44

P íklad: Implementace escaper pomocí call/cc Globální symbol na kterém budeme mít navázanou kontinuaci, viz dal²í výraz (define *top-level-escaper* #f) Na *top-level-escaper* naváºe dal²í pokra ování cyklu REPL: (call/cc (lambda (break) (set! *top-level-escaper* break))) Následující je implementace escaper pomocí call/cc (define escaper (lambda (f) (lambda args (*top-level-escaper* (apply f args))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 27 / 44

Implementace chybového hlá²ení (define error (lambda (proc message. values) (display "Error ") (display (symbol->string proc)) (display ": ") (display message) (if (not (null? values)) (begin (display " ") (let ((first #t)) (for-each (lambda (x) (if first (set! first #f) (display ", ")) (display x)) values)) (display ""))) (newline) (*top-level-escaper*))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 28 / 44

P íklad pouºití (define list-product (lambda (l) (call/cc (lambda (exit) (let proc ((l l)) (cond ((null? l) 1) ((not (pair? l)) (error 'list-product "Given argument is not a list" l)) ((not (number? (car l))) (error 'list-product "List member is not a number" (car l))) ((= (car l) 0) (exit 0)) (else (* (car l) (proc (cdr l)))))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 29 / 44

P íklad: Systém výjimek (procedura throw a makro catch) (define throw (lambda (excptn-name expr) (error 'throw "Top level throw triggered with" excptn-name))) (define-macro catch (lambda (label. prgn) (let ((exit (gensym))) `(call/cc (lambda (,exit) (let ((throw (lambda (excptn-name expr) (if (eq?,label excptn-name) (,exit expr) (throw excptn-name expr))))) (begin,@prgn))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 30 / 44

P íklad pouºití (catch 'chyba (+ 1 2) (* 3 4)) Z=) 12 P íklad pouºití (catch 'chyba (+ 1 2) (throw 'chyba 20) (* 3 4)) Z=) 20 P íklad pouºití (catch 'chyba (+ 1 2) (throw 'neexistujici-vyjimka 20) (* 3 4)) Z=) Error (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 31 / 44

Dal²í p íklad (define f (lambda (n) (let ((x 10)) (catch 'bar (catch 'foo (if (> n 0) (throw 'foo (set! x 40))) (if (< n 0) (throw 'bar (+ 1 2))) (set! x 100)) (* 2 x))))) (f -1) Z=) 3 (f 0) Z=) 200 (f 1) Z=) 80 (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 32 / 44

Dal²í p íklad o²et ování výjime ných situací: aserce (define-macro assert (lambda (proc-name assertions. body) `(cond,@(map (lambda (ass) `((not,(car ass)) (begin (display "ASSERT ") (display,proc-name) (display ": "),@(map (lambda (x) `(display,x)) (cdr ass)) (newline) (*top-level-escaper*)))) assertions) (else (begin,@body))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 33 / 44

P íklad: faktoriál s asercemi (define fak (lambda (n) (assert "faktorial" (((number? n) "arg. must be a number, given: " n) ((exact? n) n " must be an exact number") ((>= n 0) n " must be a non-negative integer")) (if (= n 0) 1 (* n (fak (- n 1))))))) Po odlad ní programu je moºné assert nahradit: (define-macro assert (lambda (proc-name assertions. body) `(begin,@body))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 34 / 44

P íklad: Jednoduchý debugger Globální symboly na kterých jsou navázány break-point a zastavení (define *next* #f) (define *stop* #f) Nastavení stopky (call/cc (lambda (f) (set! *stop* f))) P eru² výpo et (define stop-execution (lambda () (*stop*))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 35 / 44

P íklad: Jednoduchý debugger Zapi² *next* aktuální pokra ování v daném bod výpo tu, ve kterém bude zavolána procedura break-point (define break-point (lambda () (call/cc (lambda (f) (set! *next* f) (stop-execution) hic-sunt-leones)))) Pokra uj ve výpo tu (aº k dal²ímu breakpointu) (define run (lambda () (*next*))) Pro ukázku viz soubor debugger.scm (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 36 / 44

P íklad: Iterátory a jejich aplikace. iterátor pro danou datovou strukturu postupn vrací její prvky Pomocné denice: Identikátor ukon ení iterace (define *end-of-iteration* (lambda () #f)) Implementace chybového hlá²ení Predikát indikující konec iterace (define finished? (lambda (elem) (eq? elem *end-of-iteration*))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 37 / 44

(define generate-iterator (lambda (l) (letrec ((return #f) (start (lambda () (let loop ((l l)) (if (null? l) (return *end-of-iteration*) (begin (call/cc (lambda (new-start) (set! start new-start) (return (car l)))) (loop (cdr l)))))))) (lambda () (call/cc (lambda (f) (set! return f) (start))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 38 / 44

P íklad pouºití: (define p (generate-iterator '(a b c d e))) (p) Z=) a (p) Z=) b (p) Z=) c (p) Z=) d (p) Z=) e (p) Z=) #<procedura> (indikátor konce) (eq? (p) *end-of-iteration*) Z=) #t (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 39 / 44

P íklad: Hloubkový iterátor (define generate-depth-iterator (lambda (l) (letrec ((return #f) (start (lambda () (let loop ((l l)) (cond ((null? l) 'nejaka-hodnota) ((pair? l) (begin (loop (car l)) (loop (cdr l)))) (else (call/cc (lambda (new-start) (set! start new-start) (return l)))))) (return '())))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 40 / 44

Poznámka. (lambda () (call/cc (lambda (f) (set! return f) (start))))))) uº není pot eba *end-of-iteration* prohledávání je ukon eno () (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 41 / 44

P íklad pouºití (define p (generate-depth-iterator '(a (b (c (d)) e)))) (define q (generate-depth-iterator '(((a b) ((c d))) e))) (p) Z=) a (q) Z=) a (p) Z=) b (q) Z=) b (p) Z=) c (q) Z=) c (p) Z=) d (q) Z=) d (p) Z=) e (q) Z=) e (p) Z=) () (q) Z=) () (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 42 / 44

Zvý²ení výpo etní efektivity pomocí iterátor predikát equal-fringe? je pro dva seznamy pravdivý p. k. oba seznamy mají stejné atomické prvky pokud je projdeme zleva-doprava ;; p ímo aré e²ení, které je neefektivní (define equal-fringe? (lambda (s1 s2) (define flatten ; pomocná procedura: linearizace seznamu (lambda (l) (cond ((null? l) '()) ((list? (car l)) (append (flatten (car l)) (flatten (cdr l)))) (else (cons (car l) (flatten (cdr l))))))) (equal? (flatten s1) (flatten s2)))) P íklad pouºití: (equal-fringe? '(a (b (c)) () d) '(a b c (d))) Z=) #t (equal-fringe? '(a (b (c)) () d) '(a b c (e))) Z=) #f (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 43 / 44

Nová, efektivní verze equal-fringe? ;; procedura pouºívá iterátory (define equal-fringe? (lambda (s1 s2) (let ((iter1 (generate-depth-iterator s1)) (iter2 (generate-depth-iterator s2))) (let test ((v1 (iter1)) (v2 (iter2))) (or (and (null? v1) (null? v2)) (and (equal? v1 v2) (test (iter1) (iter2)))))))) (KI, UP Olomouc) PP 2, Lekce 8 Aktuální pokra ování 44 / 44