PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

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

Paradigmata programování II Korutiny a nedeterminismus

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

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

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

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

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

Paradigmata programování 1

Paradigmata programování 1

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

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

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

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

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

1. Od Scheme k Lispu

Integrování jako opak derivování

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

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

Paradigmata programování 1

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

Paradigmata programování 1

Limity funkcí v nevlastních bodech. Obsah

awk programovatelný filtr

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

Derivování sloºené funkce

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

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

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

Dotazování nad stromem abstraktní syntaxe

LISP Definice funkcí

SQL - úvod. Ing. Michal Valenta PhD. Databázové systémy BI-DBS ZS 2010/11, P edn. 6

Přednáška 3. Rekurze 1

T i hlavní v ty pravd podobnosti

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

Konceptuální modelování

Základní stavební prvky algoritmu

P íklady k prvnímu testu - Pravd podobnost

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

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

Normalizace rela ního schématu

Paradigmata programování 2

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Informace a návod k pouºití ablony pro BP student FZS v Plzni. Ing. Petr V elák 20. únor 2012

Soft Computing (SFC) 2014/2015 Demonstrace u ení sít RCE, Java aplikace

Ergodické Markovské et zce

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

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

Jevy, nezávislost, Bayesova v ta

Modelování v elektrotechnice

Teorie her. Klasikace. Pomocný text

Kelvin v kapkový generátor

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

Programovací jazyk Pascal

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Algoritmizace a programování

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

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

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

Poznámky k p edm tu: Práce s po íta em a programování

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

IPCorder KNR-100 Instala ní p íru ka

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

Uºivatelská p íru ka Octopus

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

Dotazník bezpe nosti a ochrany zdraví p i práci ve skandinávských zemích

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

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.

Text m ºe být postupn upravován a dopl ován. Datum poslední úpravy najdete u odkazu na staºení souboru. Veronika Sobotíková

Termíny zkoušek Komise Komise. subkomise 1 (obhaj.) :30 B subkomise 2 (obhaj.) :30 B8 120

Základní pojmy teorie mnoºin.

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

NPRG030 Programování I, 2018/19 1 / :03:07

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

Kompilace Makele C++ Zadání úlohy. Kompilace a Makele. OSD. O. Fi²er. April 18, O. Fi²er Kompilace, Makele

Nastavení vestav ného p evodníku Ethernet -> sériová linka ES01

2C Tisk-ePROJEKTY

Tvorba výrazu: speciální znaky shellu se uvádějí do apostrofů jednotlivé části výrazu se oddělují mezerou

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

NPRG030 Programování I, 2017/18 1 / :22:16

Transformace dat: používání syntaxe v SPSS

Základní praktikum laserové techniky

e²ení 1. série Úvodní gulá² autor: Kolektiv org

Stru né pokyny. D kujeme vám, že jste si k uspokojení svých pot eb v oblasti p enosných po íta vybrali notebook Acer.

se nazývá charakter grupy G. Dále budeme uvaºovat pouze kone né grupy G. Charaktery tvo í také grupu, s násobením denovaným

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

2. lekce Algoritmus, cyklus Miroslav Jílek

Relace. Základní pojmy.

Řízení toku programu Programátor musí být schopen nějak ovlivňovat běh programu a k tomu má několik možností:

1 Data. 2 Výsledky m ení velikostí. Statistika velikostí výtrus. Roman Ma ák

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

Jazyk Scheme: jeho syntax a sémantika

Rovnice a nerovnice. Posloupnosti.

Operační systémy Linux, Mac OS X a jejich srovnání

mísy na koření akční pole prostor pro karty koření 1 mlýnek na pepř

Stručný obsah. Část I Úvod do jazyka UML a metodiky Unified Process 25. Část II Požadavky 71. Část III Analýza 135.

S T A T U T Á R N Í M Ě S T O L I B E R E C

Počítačová simulace logistických procesů I. 11. přednáška Programování v SimTalk. ŠAVŠ, Fábry

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

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

Transkript:

KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 1 / 29

Implementace maker realizujících cykly ;; cyklus typu while (define-macro while (lambda (condition. body) (let ((loop-name (gensym))) `(let,loop-name () (if,condition (begin,@body (,loop-name))))))) P íklad pouºití: (let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1))) (list i j)) Z=) (10 45) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 2 / 29

Úprava: vrací hodnotu vyhodnocení posledního výrazu v t le (define-macro while (lambda (condition. body) (let ((loop-name (gensym)) (last-value (gensym))) `(let,loop-name ((,last-value (if #f #f))) (if,condition (,loop-name (begin,@body)),last-value))))) P íklad pouºití: (let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1)) (list i j))) Z=) (10 45) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 3 / 29

Makro pro cyklus typu for (C, PERL a dal²í) Co chceme napodobit: { int i = 0; int result = 0; } for (i = 5; i > 0; i--) { printf("stav: %i %i\n", i, result); result++; } printf("koncovy: %i %i\n", i, result); Pozn.: zatím nebudeme e²it break a continue. (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 4 / 29

Makro pro cyklus typu for P íklad zamý²leného cyklu (let ((i 0) (result 0)) (for (set! i 5) (> i 0) (set! i (- i 1)) (display (list "Stav: " i result)) (newline) (set! result (+ result i))) (display (list "Koncovy: " i result)) (newline)) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 5 / 29

e²ení ;; cyklus typu for (C, PERL a dal²í) (define-macro for (lambda (init condition incr. body) (let ((loop-name (gensym))) `(begin,init (let,loop-name () (if,condition (begin,@body,incr (,loop-name)))))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 6 / 29

Cyklus do: Nativní cyklus jazyka Scheme P íklad pouºití: (do ((x '(1 3 5 7 9) (cdr x)) (sum 0 (+ sum (car x)))) ((null? x) sum) (display (list x sum)) (newline)) Z=) 25 ; navázaný symbol ; navázaný symbol ; limitní podmínka ; t lo cyklu B hem iterace se postupn zobrazí: ((1 3 5 7 9) 0) ((3 5 7 9) 1) ((5 7 9) 4) ((7 9) 9) ((9) 16) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 7 / 29

;; cyklus do pomocí letrec (define-macro do (lambda (binding condition. body) (let ((loop-name (gensym))) `(letrec ((,loop-name (lambda,(map car binding) (if,(car condition) (begin,@(cdr condition)) (begin,@body (,loop-name,@(map caddr binding))))))) (,loop-name,@(map cadr binding)))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 8 / 29

;; cyklus do pomocí pojmenovaného letu (úprava p edchozího) (define-macro do (lambda (binding condition. body) (let ((loop-name (gensym))) `(let,loop-name,(map (lambda (x) (list (car x) (cadr x))) binding) (if,(car condition) (begin,@(cdr condition)) (begin,@body (,loop-name,@(map caddr binding)))))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 9 / 29

Cyklus typu repeat until P íklad zamý²leného pouºití (let ((x 20) (y 15)) (repeat (set! y (+ y 4)) (set! x (- x 1)) (until ((<= x 10) (list 'foo x y)) ((>= y 30) (list 'bar y (+ x 20)))))) Z=) (bar 31 36) p íkazy v t le vºdy prob hnou alespo jednou cyklus se opakuje, dokud není spln na (n která) limitní podmínka test limitních podmínek probíhá vºdy po dokon ení t la (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 10 / 29

(define but-last (lambda (l) (cond ((null? l) #f) ((null? (cdr l)) (cons '() (car l))) (else (let ((result (but-last (cdr l)))) (cons (cons (car l) (car result)) (cdr result))))))) (but-last '(a b c d)) Z=) ((a b c). d) (define but-last (lambda (l) (foldr (lambda (x y) (if y (cons (cons x (car y)) (cdr y)) (cons '() x))) #f l))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 11 / 29

;; makro realizující cyklus typu repeatuntil (define-macro repeat (lambda args (define but-last ) ; intern denovaný but-last (let* ((split-args (but-last args)) (body (car split-args)) (limits (cdr split-args)) (loop-name (gensym))) `(let,loop-name (),@body (cond,@(map (lambda (conds) `(,(car conds) (begin,@(cdr conds)))) (cdr limits)) (else (,loop-name))))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 12 / 29

Poznámka o makrech v Dr. Scheme transforma ní procedura makra se neaplikuje v prost edí svého vzniku, ale v prost edí po áte ních vazeb, prost edí po áte ních vazeb 6= globální prost edí, prost edí po áte ních vazeb: nelze v n m denovat vazby, omezení Dr. Scheme kv li odd lení makroexpanze a vyhodnocování. ;; pomocná procedura (define proc (lambda (x) (list '- x))) ;; makro (define-macro m (lambda (elem) (proc elem))) (m 10) Z=) Error: Symbol proc je nenavázaný (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 13 / 29

KVAZIKVOTOVÁNÍ úkolem je vyrobit makro realizující kvazikvotování (kvaziquote blah) + (quote blah) Z=) blah (kvaziquote (a b)) + (apply append (list (quote a)) (list (quote b)) (quote ())) Z=) (a b) (kvaziquote (a (unquote (+ 1 2)))) + (apply append (list (quote a)) (list (+ 1 2)) (quote ())) (kvaziquote (a (unquote-splicing l))) + (apply append (list (quote a)) l (quote ())) Z=) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 14 / 29

;; pomocná transforma ní procedura (define trans-expr (lambda (expr) (cond ((or (not (list? expr)) (null? expr)) (list 'list (list 'quote expr))) ((eq? (car expr) 'unquote) (list 'list (cadr expr))) ((eq? (car expr) 'unquote-splicing) (cadr expr)) ((eq? (car expr) 'kvaziquote) (list 'list (list 'quote expr))) (else (list 'list (list 'kvaziquote expr)))))) (te 1) Z=) (list (quote 1)) (te '()) Z=) (list (quote ())) (te '(1 2 3)) Z=) (list (kvaziquote (1 2 3))) (te '(unquote (1 2 3))) Z=) (list (1 2 3)) (te '(unquote-splicing (1 2 3))) Z=) (1 2 3) (te '(kvaziquote (1 2))) Z=) (list (quote (kvaz. (1 2)))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 15 / 29

;; makro pro kvazikvotování bez pouºití kvazikvotování (define-macro kvaziquote (lambda (expr) ;; pomocná transforma ní procedura (p edchozí slide) (define trans-expr (lambda (expr) )) ;; vlastní transformace (if (not (list? expr)) (list 'quote expr) (apply list 'apply 'append (append (map trans-expr expr) '((quote ()))))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 16 / 29

HYGIENICKÁ MAKRA Pro hygienická? Protoºe umoº ují vytvá et bezpe ná makra. Základní rysy Výhody denována v R5RS (krom Scheme, pokud vím, nikdo nemá) kompletn jiný p ístup k makr m neº define-macro makra jsou denována pomocí (n kolika) p episovacích pravidel prakticky odpadají sloºit kvazikvotované výrazy nem ºe nastat symbol capture makra jsou v souladu s lexikálním rozsahem platnosti makra lze denovat lokáln Nevýhody n která makra se tímto zp sobem ned lají pohodln (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 17 / 29

Soulad s lexikálním rozsahem platnosti spo ívá ve: 1 Jestliºe je v t le makra denována vazba na dosud nepouºitý symbol, tento symbol je v t le makra automaticky p ejmenován tak, aby nemohlo dojít ke kolizi se jménem jiº existujícího symbolu. o p ejmenování symbolu se programátor nestará p ejmenování probíhá zcela transparentn 2 P i vyhodnocování t la makra se vazby v²ech volných výskyt symbol (to jest vazby symbol, které nebyly vytvo ené lokáln v rámci makra) hledají v prost edí denice makra prost edí denice makra = lexikální p edek p i pouºití makra nezáleºí na vazbách v prost edí pouºití makra (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 18 / 29

Vytvo ení hygienického makra (define-syntax /nazev. /transformacni-procedura.) /transformacni-procedura. vzniká pomocí spec. formy syntax-rules Vytvo ení transforma ní procedury hygienického makra (syntax-rules /klicova-slova. /pravidlo 1. /pravidlo 2.... ) /klicova-slova.... seznam symbol, které jsou dále chápány jako klí ová slova (seznam m ºe být prázdný) /pravidlo n.... p episovací pravidla, viz dále P episovací pravidla jsou pravidla tvaru (/vzor. /nahrazní.), kde /vzor. je výraz specikující konkrétní p ípad pouºití makra, viz dále /nahrazní. je libovolný výraz, kterým bude volání makra nahrazeno v p ípad shody s daným vzorem (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 19 / 29

Vzory (pro detaily viz R5RS) se skládají ze: symboly... ozna ují klí ová slova nebo vstupní elementy seznamy skládající se ze vzor speciální vzor výpustka... (t i te ky) význam: vzor p ed kterým je výpustka se m ºe n kolikrát opakovat nebo nemusí být p ítomen Vzory se porovnávají (na úplnou shodu) se vstupem jeden po druhém. Symboly vyskytující se ve vzoru (krom prvního) mohou být: 1 symboly vyskytující se mezi klí ovými slovy shoda se vzorem nastává pouze v p ípad, kdy má vstupní výraz na dané pozici stejný symbol 2 symboly nevyskytující se mezi klí ovými slovy b hem porovnávání vstupního výrazu se vzorem jsou takové symboly navázány na vstupní výraz První symbol ve vzoru se shoduje s názvem makra. (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 20 / 29

Makro and realizované jako hygienické makro (define-syntax and (syntax-rules () ; ºádná klí ová slova ((and) #t) ; and bez argumentu ((and test) test) ; and s jedním argumentem ((and test1 test2...) ; dva a více argument (if test1 (and test2...) #f)))) Makro setf! (v tomto p ípad slouºí car, cdr a ref jako klí ová slova (define-syntax setf! (syntax-rules (car cdr ref) ((setf! (car pair) value) (set-car! pair value)) ((setf! (cdr pair) value) (set-cdr! pair value)) ((setf! (ref vector index) value) (vector-set! vector index value)) ((setf! symbol value) (set! symbol value)))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 21 / 29

Nefunk ní verze setf! (car, cdr a ref nejsou uvedena jako klí ová slova (define-syntax setf! (syntax-rules () ((setf! (car pair) value) (set-car! pair value)) ((setf! (cdr pair) value) (set-cdr! pair value)) ((setf! (ref vector index) value) (vector-set! vector index value)) ((setf! symbol value) (set! symbol value)))) P íklad, pro vý²e uvedené nefunguje: (define p (cons 10 20)) (setf! (cdr p) 'svete) ; pouºito bude první pravidlo p Z=) (svete. 20) D vod nefunk nosti: symbol cdr ve vstupním výrazu se naváºe na symbol car vstupní výraz tím pádem odpovídá prvnímu pravidlu (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 22 / 29

Makro or realizované jako hygienické makro (define-syntax or (syntax-rules () ((or) #f) ((or test) test) ((or test1 test2...) (let ((result test1)) (if result result (or test2...)))))) Makro def jako hygienické makro (zde záleºí na po adí pravidel) (define-syntax def (syntax-rules () ((def (name arg...) stmt...) (define name (lambda (arg...) stmt...))) ((def symbol stmt) (define symbol stmt)))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 23 / 29

Sloºit j²í p íklad pouºití hygienických maker: for à la Pascal for i := start to/downto end [step k] do stmt 1 stmt 2. stmt n endfor Cyklus bychom cht li pouºívat takto: (for i := 1 to 10 do (display i) (newline)) (for i := 10 downto 1 do (display i) (newline)) (for i := 1 to 10 step 2 do (display i) (newline)) (for i := 10 downto 1 step 2 do (display i) (newline)) Pomocí r zných vzor rozli²íme jednotlivé p ípady pouºití. (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 24 / 29

P íkaz for ve stylu jazyka Pascal (define-syntax for (syntax-rules (:= to downto do step) ((for var := start to end do stmt...) (let loop ((var start)) (if (<= var end) (begin stmt... (loop (+ var 1)))))) ((for var := start downto end do stmt...) (let loop ((var start)) (if (>= var end) (begin stmt... (loop (- var 1)))))). pokra ujeme na dal²ím slajdu (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 25 / 29

. pokra ování z p edchozího slajdu ((for var := start to end step inc do stmt...) (let loop ((var start)) (if (<= var end) (begin stmt... (loop (+ var inc)))))) ((for var := start downto end step dec do stmt...) (let loop ((var start)) (if (>= var end) (begin stmt... (loop (- var dec)))))))) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 26 / 29

Hygienická makra je moºné denovat lokáln pomocí speciálních forem: let-syntax... jednotlivá pravidla se vzájemn nevidí letrec-syntax... pravidla se v²echna vzájemn vidí, pravidla mohou pouºívat ostatní pravidla (hrozí zacyklení) P íklad lokální denice makra when v procedu e (define f (lambda (n) (let-syntax ((when (syntax-rules () ((when test stmt1...) (if test (begin stmt1...)))))) (when (> n 3) (display "BLAH") (newline) (+ n 1))))) (f 1) Z=) nedenovaná hodnota (f 4) Z=) 5 rovn º vytiskne BLAH (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 27 / 29

V následujícím p íkladu nedojde u symbolu test k jeho zachycení (define f (lambda (n) (let-syntax ((when (syntax-rules () ((when test stmt1...) (if test (begin stmt1...)))))) (let ((test #f)) (when (> n 3) (display (list test "BLAH")) (newline) (+ n 1)))))) (f 1) Z=) nedenovaná hodnota (f 4) Z=) 5 rovn º se vytiskne (#f BLAH) (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 28 / 29

Následující nebude fungovat: & je denované pomocí & (let-syntax ((& (syntax-rules () ((&) #t) ((& test) test) ((& test1 test2...) (if test1 (& test2...) #f))))) (& 1 2 3)) Z=) Error: & not bound Následující uº bude fungovat (díky letrec-syntax) (letrec-syntax ((& (syntax-rules () ((&) #t) ((& test) test) ((& test1 test2...) (if test1 (& test2...) #f))))) (& 1 2 3)) Z=) 3 (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 29 / 29