PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

Podobné dokumenty
PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

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

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

Paradigmata programování 1

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

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

Paradigmata programování 1

Paradigmata programování II Korutiny a nedeterminismus

Paradigmata programování 1

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

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

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

Derivování sloºené funkce

1. Od Scheme k Lispu

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

Paradigmata programování 1

Integrování jako opak derivování

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

Vektory. Vektorové veli iny

T i hlavní v ty pravd podobnosti

Přednáška 3. Rekurze 1

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

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Limity funkcí v nevlastních bodech. Obsah

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

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

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

Jevy, nezávislost, Bayesova v ta

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

Kelvin v kapkový generátor

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

Funkcionální programování úvod

Teorie her. Klasikace. Pomocný text

Reálná ísla a posloupnosti Jan Malý

Rovnice a nerovnice. Posloupnosti.

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

e²ení 4. série Binární operace

Ergodické Markovské et zce

Dotazování nad stromem abstraktní syntaxe

Modelování v elektrotechnice

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

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

Vzorové e²ení 4. série

P íklady k prvnímu testu - Pravd podobnost

VYBRANÉ APLIKACE RIEMANNOVA INTEGRÁLU I. OBSAH A DÉLKA. (f(x) g(x)) dx.

Konceptuální modelování

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á

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

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

LISP Definice funkcí

Normalizace rela ního schématu

Zápo tová písemná práce. 1 z p edm tu 01MAB3 varianta A

ízení Tvorba kritéria 2. prosince 2014

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

Uºivatelská p íru ka Octopus

Jazyk Scheme: jeho syntax a sémantika

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

Aplikovaná matematika 1

Obsah. Pouºité zna ení 1

Základní stavební prvky algoritmu

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

Zadání. Založení projektu

Vážení klienti, Upozorníme i na praktické důsledky nesjednání pravidelného pracoviště při poskytování cestovních náhrad. TaxVision, s.r.o.

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

Transak ní zpracování I

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

Co je to tensor... Vektorový prostor

nazvu obecnou PDR pro neznámou funkci

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

3 D leºitá rozd lení náhodné veli iny

Základní pojmy teorie mnoºin.

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

DYNATECH DYNAMICS & TECHNOLOGY, S.L. nebude zodpov dný za žádné poškození zp sobené nedodržením výše uvedených základních údaj.

HLAVA III PODROBNOSTI O VEDENÍ ÚST EDNÍHO SEZNAMU OCHRANY P ÍRODY

Základní praktikum laserové techniky

Algoritmizace a programování

Co je L Y X? Vlastnosti a nástroje Instalace Zdroje. Adam Farnik. V B - TU Ostrava. Elektronické publikování, 2008

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

Tomá² H ebejk Obousm rné heuristické vyhledávání BAKALÁ SKÁ PRÁCE. Univerzita Karlova v Praze. Matematicko-fyzikální fakulta

1 Spojitý model. 1.1 Princip stochastického modelu

1. Spo t te limity (m ºete pouºívat l'hospitalovo pravidlo) x cotg x 1. c) lim. g) lim e x 1. cos(x) =

P EHLED FUNKCÍ BRICX. Jan Mare²

Paradigmata programování 2

OBECN ZÁVAZNÁ VYHLÁ KA. Obce Plavsko. O fondu rozvoje bydlení

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

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

Obsah. Zpracoval Ctirad Novotný pro matmodel.cz.

IP kamerový systém Catr - uºivatelský návod k obsluze

DYNATECH - PROGRESIVNÍ ZACHYCOVA PR-2000-UD Datum

Testy pro více veli in

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

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

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

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

Specifikace systému ESHOP

Post ehy a materiály k výuce celku Funkce

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

Konstruk ní geometrie

Veřejnoprávní smlouva o poskytnutí investiční dotace č. 1/2016

Transkript:

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

Opakování (kvazikvotování) `(1 2 3 4 5) Z=) (1 2 3 4 5) `(1 (+ 2 3) 4 5) Z=) (1 (+ 2 3) 4 5) `(1,(+ 2 3) 4 5) Z=) (1 5 4 5) `(1 ((,(+ 2 3))) 4 5) Z=) (1 ((5)) 4 5) (define s '(a b c)) `(1,s 2) Z=) (1 (a b c) 2) `(1,@s 2) Z=) (1 a b c 2) `(1 '2 3) Z=) (1 (quote 2) 3) `'(1 2 3) Z=) (quote (1 2 3)) '`(1 2 3) Z=) (quasiquote (1 2 3)) `(1 `(2 3)) Z=) (1 (quasiquote (2 3))) `(1 `(,(+ 1 2) 3)) Z=) (1 (quasiquote ((unquote (+ 1 2)) 3))) `(1,`(,(+ 1 2) 3)) Z=) (1 (3 3)) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 2 / 35

Problém: chceme upravit if tak, aby p i absenci alternativního výrazu vracel #f nyní máme: (if (= 1 2) 'blah) Z=) nedenovaná hodnota chceme: (new-if (= 1 2) 'blah) Z=) #f nabízí se vy e²it pomocí nové procedury: (define new-if (lambda (elem1 elem2) (if elem1 elem2 #f))) p i volání new-if je vºdy vyhodnocen i druhý argument: (new-if #f blah-blah) Z=) Error (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 3 / 35

Pot ebujeme: b hem vyhodnocování kaºdý výraz tvaru (new-if expr1 expr2) nahradit výrazem: (if expr1 expr2 #f) bez toho aniº by se vyhodnocovaly expr1 a expr2 Jinými slovy: pot ebujeme zavést p edpis, který bude provád t transformaci kódu transformace... konkrétní ást kódu je nahrazena jinou po transformaci prob hne vyhodnocení transformovaného kódu (define x 11) (new-if (even? x) (+ x 1)) + transformace (if (even? x) (+ x 1) #f) + vyhodnocení #f (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 4 / 35

Jak se dívat na transformaci? m ºeme si ji p edstavit jako (klasickou) proceduru, které jsou p edány argumenty v nevyhodnocené podob transformace se v n kterých jazycích nazývá makroexpanze ;; transforma ní procedura pro new-if (define new-if-trans (lambda (test expr. alt) (list 'if test expr (if (null? alt) #f (car alt))))) (new-if-trans 'e1 'e2 'e3) Z=) (if e1 e2 e3) (new-if-trans 'e1 'e2) Z=) (if e1 e2 #f) (new-if-trans '(even? x) '(+ x 1)) Z=) (if (even? x) (+ x 1) #f) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 5 / 35

krat²í e²ení pomocí kvazikvotování (define new-if-trans (lambda (test expr. alt) `(if,test,expr (begin #f,@alt)))) p íklady transformace: (new-if-trans 'expr1 'expr2 'expr3) Z=) (if expr1 expr2 (begin #f expr3)) (new-if-trans 'expr1 'expr2) Z=) (if expr1 expr2 (begin #f)) (new-if-trans '(even? x) '(+ x 1)) Z=) (if (even? x) (+ x 1) (begin #f)) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 6 / 35

nouzové e²ené new-if, které se jiº chová jak má manuální spu²t ní transforma ní procedury následné vyhodnocení transformovaného výrazu (eval (new-if-trans '(even? x) '(+ x 1))) Výhody e²ení: pokud je první výraz nepravdivý, alternativní výraz není vyhodnocen touto konstrukcí (new-if) lze zastavit rekurzi Nevýhody e²ení: v²echny p edávané argumenty musíme explicitn kvotovat transformovaný výraz musíme ru n vyhodnotit pomocí eval eval ve v t²in interpret pracuje jen v globálním prost edí volání je nep ehledné (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 7 / 35

problém s lexikálními vazbami (let ((x 10)) (eval (new-if-transformer '(even? x) '(+ x 1)))) Z=) error: x not bound áste né e²ení: pouºití (the-environment) ve v t²in interpret nebude fungovat (let ((y 10)) (eval (new-if-transformer '(even? y) '(+ y 1)) (the-environment))) navíc jsme se nezbavili nep ehledného kódu e²ení problému: zavedení maker (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 8 / 35

MAKRA dva základní pohledy na makra 1. POHLED: Makra jsou roz²í ením syntaxe jazyka makro = dáno denicí svého transforma ního p edpisu po na tení výrazu (READ) je v n m provedena makroexpanze tuto fázi provádí tzv. preprocesor aº po dokon ení expanze v²ech maker nastává vyhodnocování výrazu nemá smysl uvaºovat pojem aplikace makra takto na makra pohlíºí v t²ina PJ: C, DrScheme, Common LISP,... Výhody p ístupu: preprocesor a vlastní eval jsou zcela nezávislé preprocesor m ºe být aktivován okamºit po na tení výrazu umoº uje snadnou kompilaci kódu (v kompilovaném kódu jiº pochopiteln ºádná makra nejsou) Nevýhody p ístupu: makra jsou mimo jazyk ( asto se zapisují odli²n, t eba v C) makra nejsou elementy prvního ádu (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 9 / 35

MAKRA dva základní pohledy na makra 2. POHLED: Makra jsou speciální elementy jazyka makro = element jazyka obsahující ukazatel na transf. proceduru transforma ní procedura... klasická procedura je pot eba roz²í it eval: p ípad, kdy se první prvek seznamu vyhodnotí na makro makra jsou uºivatelsky denované speciální formy takto na makra budeme pohlíºet my (dále t eba PJ: M4, T E X) Výhody p ístupu: makra jsou elementy prvního ádu s makry lze pracovat jako s daty, mohou dynamicky vznikat/zanikat za b hu programu m ºeme uvaºovat koncept anonymního makra Nevýhody p ístupu: k makroexpanzi dochází aº p i innosti eval prakticky znemoº uje ú innou kompilaci kódu p i neuváºeném pouºívání maker komplikuje lad ní programu (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 10 / 35

Motiva ní p íklady denice maker (define-macro new-if (lambda (<test> <expr>. <alt>) (list 'if <test> <expr> (if (null? <alt>) #f (car <alt>))))) ;; new-if: pomocí kvazikvotování (define-macro new-if (lambda (<test> <expr>. <alt>) `(if,<test>,<expr> (begin #f,@<alt>)))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 11 / 35

P íklad pouºití makra ;; new-if: pomocí kvazikvotování (define-macro new-if (lambda (<test> <expr>. <alt>) `(if,<test>,<expr> (begin #f,@<alt>)))) (let ((x 10)) (new-if (even? x) (+ x 1))) + aktivace transforma ní procedury makra (if (even? x) (+ x 1) (begin #f)) + vyhodnocení výrazu v prost edí, kde x má vazbu 10 11 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 12 / 35

Roz²í ení EVAL Eval[E ; P]: (A) Pokud je E cislo,... jako obvykle (B) Pokud je E symbol,... jako obvykle (C) Pokud je E seznam tvaru (E 1 E 2 E n ), pak nejprve provedeme vyhodnocení prvního prvku E 1 v prost edí P a výslednou hodnotu ozna íme F 1, to jest F 1 := Eval[E 1 ; P]. Mohou nastat ty i situace: (C.1) Pokud F 1 je procedura,... jako obvykle (C.2) Pokud F 1 je speciální forma,... jako obvykle (C.3) Pokud F 1 je makro jehoº transforma ní procedura je T, pak 1 F 0 := Apply[T ; E2; : : : ; En] (F 0 je výsledkem aplikace transf. procedury na nevyhodnocené arg.) 2 Výsledek vyhodnocení F elementu E v prost edí P je denován F := Eval[F 0 ; P] (F je výsledek vyhodnocení elementu F 0 v prost edí P). (C.e) Pokud F 1 není procedura, speciální forma, ani makro, pak vyhodnocení kon í chybou CHYBA: První prvek seznamu.... (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 13 / 35

Lad ní maker: základní princip potla íme vyhodnocení transformovaného kódu vyuºívá dodate né KVOTOVÁNÍ (define-macro new-if (lambda (test expr. alt) (list 'quote (list 'if test expr (if (null? alt) #f (car alt)))))) (new-if #f blah-blah) Z=) (if #f blah-blah #f) (define-macro new-if (lambda (test expr. alt) `'(if,test,expr (begin #f,@alt)))) (new-if #f blah-blah) Z=) (if #f blah-blah (begin #f)) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 14 / 35

chceme vytvo it and2 dvou argument vracející #t nebo #f chceme vytvo it pouze s pomocí if ;; nedosta ující e²ení pomocí procedury: (define and2 (lambda (elem1 elem2) (if elem1 (if elem2 #t #f) #f))) p edchozí má váºný nedostatek: (and2 #f blah-blah) Z=) error (chceme #f) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 15 / 35

and2 se dv ma argumenty vracející konjunkci pot ebujeme: b hem vyhodnocování kaºdý výraz (and2 expr1 expr2) nahradit výrazem (if expr1 (if expr2 #t #f) #f) bez toho aniº by se vyhodnocovaly expr1 a expr2 e²ení pomocí makra: (define-macro and2 (lambda (expr1 expr2) `(if,expr1 (if,expr2 #t #f) #f))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 16 / 35

Ukázky pouºití and2 (and2 1 (+ 1 2)) + (if 1 (if (+ 1 2) #t #f) #f) + #t (and2 #f blah-blah) + (if #f (if blah-blah #t #f) #f) + #f (and2 #t #f) + (if #t (if #f #t #f) #f) Z=) #f (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 17 / 35

Anaforický if: if* if*, který pracuje stejn jako if, ale umoº uje v druhém a t etím výrazu pouºívat symbol $result, který bude vºdy navázaný na výsledek vyhodnocení prvního výrazu praktické roz²í ení, místo: (if (member 'b '(a b c d)) (list 'nalezen (member 'b '(a b c d))) 'blah) sta í napsat: (if* (member 'b '(a b c d)) (list 'nalezen $result) 'blah) Z=) (nalezen (b c d)) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 18 / 35

e²ení: b hem vyhodnocování kaºdý výraz (if* expr1 expr2 expr3) pot ebujeme nahradit výrazem: (let (($result expr1)) (if $result expr2 expr3)) a to op t bez vyhodnocování expr1 aº expr3 if* jako makro (define-macro if* (lambda (test expr. alt) `(let (($result,test)) (if $result,expr,@alt)))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 19 / 35

Ukázky pouºití if* bez $result se chová jako normální if (if* 1 2 3) + (let (($result 1)) (if $result 2 3)) + 2 p íklad pouºití $result (if* 1 $result 3) + (let (($result 1)) (if $result $result 3)) + 1 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 20 / 35

Sloºit j²í ukázka pouºití if* (if* (member 'b '(a b c d)) (list 'nalezen $result) 'blah) + (let (($result (member (quote b) (quote (a b c d))))) (if $result (list (quote nalezen) $result) (quote blah))) + (nalezen (b c d)) V²imn te si: v expandovaném výrazu nejsou ºádné `', (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 21 / 35

if pomocí cond (define-macro if (lambda (test expr alt) `(cond (,test,expr) (else,alt)))) if pomocí cond (bez nutnosti mít alternativní v tev) (define-macro if (lambda (test expr. alt) `(cond (,test,expr) (else (begin #f,@alt))))) podobné jako p edchozí, ale vracíme nedenovanou hodnotu (define-macro if (lambda (test expr. alt) `(cond (,test,expr) (else (begin (cond),@alt))))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 22 / 35

cond pomocí if musíme p epsat jeden cond-výraz pomocí n kolika if ;; základní cond pomoci if (pomoci rekurzivního vno ení) (define-macro cond (lambda clist (let dive-ifs ((clist clist)) (if (null? clist) `(if #f #f) (if (equal? (caar clist) 'else) (cadar clist) `(if,(caar clist),(cadar clist),(dive-ifs (cdr clist)))))))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 23 / 35

P íklad pouºití (cond ((= x 3) 'blah) + (if (= x 3) + ((> x 10) (+ 1 x)) ((prop? x y) (list x y)) (else (f 20))) (quote blah) (if (> x 10) (+ 1 x) (if (prop? x y) (list x y) (f 20)))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 24 / 35

cond pomocí if musíme p epsat jeden cond-výraz pomocí n kolika if ;; základní cond pomoci if ( e²eno jako rekurzivní makro) (define-macro cond (lambda clist (if (null? clist) `(if #f #f) (if (equal? (caar clist) 'else) (cadar clist) `(if,(caar clist),(cadar clist) (cond,@(cdr clist))))))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 25 / 35

P íklad pouºití (cond ((= x 3) 'blah) + (if (= x 3) + ((> x 10) (+ 1 x)) ((prop? x y) (list x y)) (else (f 20))) (quote blah) (cond ((> x 10) (+ 1 x)) ((prop? x y) (list x y)) (else (f 20)))) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 26 / 35

Roz²í ená verze define define jsme zatím pouºívali pouze ve tvaru (define symbol /vyraz.) v R6RS Scheme je define zaveden taky ve tvaru (define (symbol /argumenty...) /vyrazy...) P íklad: faktoriál (define (f n) (if (= n 1) 1 (* n (f (- n 1))))) P íklad: nepovinné argumenty (define (f x y. args) (list x y args)) (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 27 / 35

Roz²í ená verze define Pokud by ná² interpret nedisponoval roz²í eným define, pak bychom jej mohli vyrobit jako makro: (define-macro def (lambda (first. args) (if (symbol? first) `(define,first,@args) `(define,(car first) (lambda,(cdr first),@args))))) P íklad pouºití: (def (f n) (if (= n 1) 1 (* n (f (- n 1))))) (f 6) Z=) 720 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 28 / 35

Konjunkce libovoln mnoha argument pomocí if ;; základní verze (define-macro and (lambda args (if (null? args) #t `(if,(car args) (and,@(cdr args)) #f)))) (and 1 2 3) Z=) #t protoºe: (and 1 2 3) Z=) (if 1 (and 2 3) #f) Z=) (and 2 3) Z=) (if 2 (and 3) #f) Z=) (and 3) Z=) (if 3 (and) #f) Z=) (and) Z=) #t Z=) #t (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 29 / 35

Konjunkce libovoln mnoha argument pomocí if ;; zlep²ená verze (zobecn né pravdivostní hodnoty) (define-macro and (lambda args (if (null? args) #t (if (null? (cdr args)) (car args) `(if,(car args) (and,@(cdr args)) #f))))) nyní se jiº chová jako klasický and: (and) Z=) #t (and 1 2 3) Z=) 3 (and 1 #f 3) Z=) #f (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 30 / 35

Disjunkce libovoln mnoha argument pomocí if ;; základní verze (define-macro or (lambda args (if (null? args) #f `(if,(car args) #t (or,@(cdr args)))))) P íklad pouºití: (or) Z=) #f (or 1 2 3) Z=) #t cht li bychom 1 (or #f 2 3) Z=) #t cht li bychom 2 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 31 / 35

Disjunkce libovoln mnoha argument pomocí if ;; roz²í ená verze (define-macro or (lambda args (if (null? args) #f (if (null? (cdr args)) (car args) `(if,(car args),(car args) (or,@(cdr args))))))) Chová se (zdánliv ) v po ádku: (or) Z=) #f (or 1 2 3) Z=) 1 (or #f 2 3) Z=) 2 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 32 / 35

Problémy s implementací disjunkce pomocí if na²e implementace or: dvakrát vyhodnocuje pravdivé argumenty (krom posledního) d sledek: nechová se jako klasický or pokud pouºijeme vedlej²í efekt Chování klasického or (let ((x 0)) (or (begin (set! x (+ x 1)) x) blah)) Z=) 1 Chování na²eho or: (let ((x 0)) (or (begin (set! x (+ x 1)) x) blah)) Z=) 2 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 33 / 35

Problémy s implementací disjunkce pomocí if ;; pokus o e²ení p edchozího problému (define-macro or (lambda args (if (null? args) #f (if (null? (cdr args)) (car args) `(let ((result,(car args))) (if result result (or,@(cdr args)))))))) Nyní uº jsme p edchozí problém odstranili,... (let ((x 0)) (or (begin (set! x (+ x 1)) x) blah)) Z=) 1 (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 34 / 35

... ale nový problém jsme vyrobili Klasický or: (let ((result 10)) (or #f result)) Z=) 10 Ná² or: (let ((result 10)) (or #f result)) + (let ((result #f)) (if result result (or result))) Z=) #f do²lo k p ekrytí symbolu result symbolem stejného jména, který je pouºíván uvnit na²eho makra tomuto efektu se íká symbol capture (variable capture) v dal²í lekci ukáºeme isté e²ení tohoto problému (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 35 / 35