KATEDR� INFORMATIKY� � EDECK� FAKULT�

RÍRODO�  UNIVERZIT� PALACKÉHO� OLOMOU�

PARADIGMAT� PROGRAMOVÁN� 2� VEDLEJŠ� EFEK�

Slajd� vytvo

ri� Vilé� Vychodi�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�

C� j� vedlejš� efekt�

Imperativn� rys� p

r� programován� funkcionáln� programován� � zaloen� n� postupn� aplikac� procedu� (funkcí� LISP� Scheme� ML� Haskell� � � �

proceduráln� programován� � zaloen� n� postupné� vykonáván� príka�

u� 

kter� maj� vedlejš� efek� C� PASCAL� FORTRAN� � � � Trend� objektov� eorientovan� programován�

funkcionáln� eobjektov� � zaloen� n� generickýc� procedurác� CLO� (Commo� LIS� Objec� System)� GOOP� (objektov� Scheme� proceduráln� eobjektov� � zaloen� n� zasílán� signál�

uPERL� 

PYTHON� Java� C++� C],…� � etšin� „soudobýc� PJ�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�

Jak� typ� vedlejšíc� efekt�

urozeznávám� 

hodn� etyp�

u

vstupn� e� výstupn� operac� (� � ekter� F� um� � be� vedlejšíh� efektu� treb� Haskell� z� 

eno� vazb� symbol�

tí� s� budem� zabýva� dne�

destruktivn� z�  eno� datov� struktur� tí� s� budem� zabýva� príšt� e

Pripomínáme� F� j� nuj� vytvori� vedlejš� efekt

cistý� poku� programátorov� neumo�  Schem� nen� cistý

cist� (mám� define)� Haskel� j� 

Ná� interpre� � Lekc� 1� by� ckoli� by� napsá� „n� 

cist� (acist� e“)�

vedlejš� efek� nen� v� F� n� škodu� mus� s� al� u� 

e� pouíva�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�



Cí� s� budem� zabýva�

obohatím� Schem� � � 

ekoli� ryz� imperativníc� konstrukt�

udemonstrujem� 

n� to� rys� imperativníc� jazyk�

u

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�

Sekvencován� p

ríkaz�

u

Speciáln� form� begin� postupn� vyhodnocen� výraz�

u� 

vrácen� výsledk� vyhodnocen� posledníh� � nic�

(begi� (� � 2� (� � 4)�

zd� u� mám� vedlejš� efekt� vytiš� císl� n� obrazovku

en� 

(begi� (displa� (� � 2)� (newline� (� � 4)�

Pozor� (displa� “Ahoj”� vytiskn� n� obrazovku� re� 

eze� nelz� chápa� jak� „výslede� vyhodnocení“� tí� j� nedenovan� hodnota�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�

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) PP2A, Lekce 1 Vedlejší efekt 6 / 40 následující je pouití begin v novém prostredí 1))) x Z=) nedef. prepis predchozího (let () (begin (define x 10) (* 2 x))) x Z=) nedenovaná hodnota Jan Konecný (KI, UP Olomouc) PP2A, Lekce 1 Vedlejší efekt 7 / 40 Tela procedur obsahují „implicitní begin“ op et se m ueme vrátit ke konceptu „jednoho výrazu v t ele 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=) nedenovaná hodnota Jan Konecný (KI, UP Olomouc) PP2A, Lekce 1 Vedlejší efekt 8 / 40 Pouit� pení

r� la� 

(defin� depth-ma� (lambd� (� l� (con� 2)� (con� (� (ca� l)� (depth-ma� � (cd� l)))� (els� (con� (depth-ma� � (ca� l)� (depth-ma� � (cd� l))))))�

predchoz� kó� lz� obohati� � sekvenc� tisknouc� argument� sledování� hodno� n� výstup� j� mon� odladi� procedur�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� � � 4�

Provedení príkaz u pro kadý prvek seznamu (for-each (lambda (x) (display “Cislo: ”) (display x) (newline)) '(10 20 30 40)) Z=) nedenovaná hodnota (for-each (lambda (x) x) '(1 2 3)) Z=) nedenovaná 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) PP2A, Lekce 1 Vedlejší efekt 10 / 40 Procedur� for-eac� snadn� u� 

elám�

for-eac� lz� jednoduš� naprogramova� (verz� pr� � seznam)� všim� 

et� s� pouit� i� be� alternativníh� výraz� (defin� for-eac� (lambd� (� l� (i� (no� (null� l)�

(begi�

(� (ca� l)�

(for-eac� � (cd� l)))))�

� obecn� verz� j� tak� jednoduchá�

(defin� for-eac�

(lambd� (� � lists�

(i� (no� (null� (ca� lists))�

(begi�

(appl� � (ma� ca� lists)�

(appl� for-eac� � (ma� cd� lists)))))�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

Priríka

ríka� prazen�

Obecn� schém�

LVALU� :� RVALUE�

LVALU� ..� pa� 

et'ov� míst� (adresa� RVALU� � � � hodnot�

V� Scheme� reprezentová� speciáln� formo� set� (set� /symbo� ./výra� .�

sémantik� � hierarchi� prostred� vyhlede� symbo� /symbo� .� z� 

1 2 cn� aktuální� (lokálním� prostredí� � pokr� c� s� 

cu� pre� jeh� rod� ere� k� globálnímu� poku� /symbo� � nem� vazb� � ádné� prostredí� zahla� chybu�

� op� 

cné� prípad� enahrad� vazb� symbol� /symbo� � hodnoto� vzniklo� vyhodnocení� /výra� .�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

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) PP2A, Lekce 1 Vedlejší efekt 13 / 40 versus: (define x 100) (let 3) (set! x (+ x 1)) (+ x 1)) x Z=) 100 Jan Konecný (KI, UP Olomouc) PP2A, Lekce 1 Vedlejší efekt 14 / 40 Programován� � prazení

ríkaze� p�� ri



cist� rešen� v� funkcionální� stylu�

(defin� fi� (lambd� (n�

(le� ite� 4))))�

� jazycíc� jak� j� C� PASCAL� FORTRA� � spol� � cyklu�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

Programován� � prazení

ríkaze� p�� ri

in� fi� (n� in� n�

� in� � � 1� � � 1� c� i� fo� (i� n;i� 1;� –� �

� � b� � � a+b� � � c�

� retur� a� �

uem� 

otrock� prepsa� � v� Scheme� nen� al� � 

ekné� an� efektivní�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

(defin� fi�

(lambd� (n� (defin� � 1� (defin� � 1� (defin� � 'pomocna-promenna� (defin� � n� (defin� loo�

(lambd� (� (i� (� � 1�

(begi� (set� � b� (set� � (� � b)� (set� � c� (set� � (� � 1)� (loop))))�

(loop� a)�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

n� druho� stran� � � lz� programova� be� vedlejšíh� efektu�

in� fib_ite� (a� b� i� inta� b� i� � i� (� <� 1� retur� a� els� retur� fib_ite� (b� � � b� � � 1)� �

in� fib_ws� (n� in� n� � retur� fib_ite� (1� 1� n)� �

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

Varován�

Schem� m� vš� � dispozic� � tomu� abycho� s� n� � 

e� mohl� díva� jak� n� plnohodnotn� imperativn� jazyk� p�� ripraktické� programován� v� Schem� b� al� m

el� prevláda� funkcionáln� rysy� �

uvod� 

vedlejš� efek� � obrovsk� zdro� chy� � programec� N

ekd� s� vedlejš� efekt� hodí�

(le� 5)� zvedn� � � �

'(� bc� � f))�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 1� � 4�

Procedury pracující s globálními symboly globálne 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) PP2A, Lekce 1 Vedlejší efekt 20 / 40 D� rekryt� lexikáln� vazb� symbolu

casn� p

Speciáln� form� fluid-le� (fluid-le� 6) (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) PP2A, Lekce 1 Vedlejší efekt 22 / 40 Procedur� dríc� s� vnit

rn� sta�

Pozor� následujíc� nefunguje�

všim� en� lambd� � let

et� s� zá� 

(defin� in� (lambd� (x�

(le� 7)

P�� ripouíván� procedu� � vedlejší� efekte� s� podstatn� eh�

u� 

rlad� u� nest� 

c�

pouz� testova� vstup� � výstup� procedury� musím� vd� p� 

cíta� � tím� jak� m�

procedur� zrovn� vnitrn� stav�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 2� � 4�

N� c� j� t

reb� dá� pozo�

build-lis� pracujíc� zepred� (defin� build-lis� (lambd� (� f� (le� ite� 8)))))�

build-lis� pracujíc� zezad� (defin� build-lis� (lambd� (� f� (le� ite� 9)

(i� (� � 0�

au�

(ite� (� � 1� (con� (� i� aux)))))�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 2� � 4�

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 10) (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) PP2A, 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 11) (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) PP2A, 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) PP2A, 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 12) (map (lambda (x) (set! i (+ i 1)) (f i x)) l)))) (map-index cons '(a b c d e)) Z=) 13) Jan Konecný (KI, UP Olomouc) PP2A, 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 14) (aux '())) (if (null? l) aux (iter (cdr l) (cons (f (car l)) aux)))))) (map-index cons '(a b c d e)) Z=) 15) Jan Konecný (KI, UP Olomouc) PP2A, Lekce 1 Vedlejší efekt 29 / 40 Reentrantn� procedur�

Procedur� s� nazýv� reentrantní� poku� �

u� 

bý� prerušen� � 

ehe� jejíh� vykonáván� (vyhodnocován� � cn� evyvolána

el� � prípad� eScheme� � pa� bezp�  znov� predtím� ne� t� predchoz� vykonáván� sko� u� být

cí� T� prerušen� �

z�

usoben� 

treb� skokem� neb� vyvolání� (aplikac� � prípad� eScheme)�

Pozn� Tot� s� � ej� p�� ripouit� rekurze.

en� e� 

Následujíc� procedur� nen� reentrantní�

(defin� lengt� (le� 16)� list� delka))�

T� s� ná� al� zatí� nepoda�� rívyvola� tak� ab� s� problé� projevil�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

Jin� príklad� reverse-ma� pr� jede� seznam�

(defin� reverse-map� (le� 17)

(lambd� (� l� (set� vyslede� ()� (for-eac� (lambd� (x�

(set� vyslede� (con� (� x� vysledek))� l� vysledek))�

Tad� u� st� ec� jako�

c� pouí� � 

(reverse-map� (lambda(x� (reverse-map� � x)� '18)

Tedy� nezneuíva� vnitrn� sta� � procedur� kter� bycho� rád� � 

el� reentratní�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

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 19)) '(,(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 ⇐)) 20) Z=) 21) Jan Konecný (KI, UP Olomouc) PP2A, Lekce 1 Vedlejší efekt 32 / 40 Pouit�

lz� vi� et� ja� mergesor� postupn� eporovnáv� prvky�

(let� 22)� (displa� (mergesor� '(� � � � � � � � � 8� new-pred?)� (newline� (get-called)�

neb� quicksort�

(let� 23)� (displa� (quicksor� '(� � � � � � � � � 8� new-pred?)� (newline� (get-called)�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

Jednoduch� objektov� systé�

Objektov� paradigm� (zabýv� s� jí� cel� tret� semest� PP�

m� s� jí� nebudem� prím� zabýva� základn� myšlenka� programáto� spravuj� systé� element�

u(objek� 
u)� 

kter� maj� s�

u� 

stav� výp�  cetn� proce� � O� jazyk� j� sloe� z� vzájemn� interakc� objekt�

u� 

z� ejš� objektov� systém� jso� zaloen� n� zasíláni

e� jejic� stav� (nejzná�  (emisi� signál�

u� 

jejic� príjm� (pomoc� slo�

u)� 

tzv� message-passin� styl� o� programming�

� reš� pohodln� e

ekter� problém� s� pomoc� O� 

nap�� r.„okna� tl� u� prirozen� stav� lz� j� chápa� jako

cítk� � jin� prvk� GUI� maj� s�

objekt� � terminologi� OO�

Ukáem� � jednoduch� objektov� systé� umo� 

nujíc� vytváren� instanc� � t� jes� element�

ujednoh� 

typu� kter� maj� vnitrn� sta� � komunikuj� � v� etem

ejší� s�  pomoc� signál�

u

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

(defin� stac�

;� dat� (vnit

rn� sta� objektu�

(le� 24)25))))�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

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) PP2A, Lekce 1 Vedlejší efekt 36 / 40 ;� j� zásobní� prázdný�

(defin� is-empty� (lambd� (� (� dept� 0))�

;� p

ride� prve� n� vrcho� zásobník�

(defin� pus�

(lambd� (elem� (set� stac� (con� ele� stack)� (set� dept� (� dept� 1)))�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

;� odstra� nprve� � vrchol� zásobník�

(defin� po� (lambd� (�

(i� (is-empty?� (erro� “canno� perfor� 'pop'� stac� i� empty”� (begi�

(set� stac� (cd� stack)� (set� dept� (� dept� 1)))))�

;� vrat� prve� nacházejíc� s� n� vrchol� zásobník�

(defin� to� (lambd� (�

(i� (is-empty?� (erro� “stac� i� empty”� (ca� stack)))�

Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

(defin� make-stac� (lambd� (� (le� 26)27)))))�

Ja� Kon� cný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 3� � 4�

(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) PP2A, Lekce 1 Vedlejší efekt 40 / 40

1)
lambda () (begin (define x 10) (* 2 x
2)
null� l� '()� ((no� (list� (ca� l
3)
x 10
4)
� 1� (� 1� (� n)� (i� (⇐i1� � (ite� � (� � b� (� � 1
5)
� 0)� nasta� � n� � (for-eac� (lambd� (x� (displa� “Index� “� (displa� i� (displa� � � prvek� “� (displa� x� (newline� (set� � (� � 1
6)
valu� 200)� (displa� (in� 10)� (newline� (displa� (in� 10)� zobraz� 21� zobraz� 22� (newline)� (in� 10� ..� vrát� s� � �
uvodn� 
vazb� e (le� ((valu� 200)� (displa� (in� 10)� pracuj� � globáln� vazbo� (newline� (displa� (in� 10)� pracuj� � globáln� vazbo� (newline)� Ja� Konecný(KI� U� Olomouc� P� 2A� Lekc� � Vedlejš� efek� 2� � 4� Procedury drící si vnitrní stav místo globálního symbolu meníme lokální vazbu symbolu, na kterou není vid et zvencí (define inc (let ((value 0
7)
valu� 0)� (set� valu� (� valu� x)� value
8)
� 0)� (i� (� � n� '(� (con� (� i� (ite� (� � 1
9)
� (� � 1)� (au� '(
10) , 11)
value 0
12)
i -1
13)
0 . a) (1 . b) (2 . c) (3 . d) (4 . e
14)
l (reverse l
15)
4 . a) (3 . b) (2 . c) (1 . d) (0 . e
16)
delk� 0)� (lambd� (list� (set� delk� 0� (for-eac� (lambda(x� (set� delk� (� delk� 1
17)
vyslede� (
18)
1� (� 3� (4
19)
called-with-values '(
20)
car p) 10 20) Z=) #t ((car p) 20 30) Z=) #f ((car p) 30 20) Z=) #f ((cadr p
21)
10 . 20) (20 . 30) (30 . 20
22) , 23)
pre� (make-pre� ⇐)� (new-pred� (ca� pred)� (get-calle� (cad� pred
24)
stac� '()� (dept� 0)� (defin� is-empty� (lambd� (� …)� (defin� pus� (lambd� (elem� …)� (defin� po� (lambd� (� …)� (defin� to� (lambd� (� …)� ;� dispatcher� aktivuj� jednotliv� procedur� podl� jme� signál�
u
(lambd� (signa� � args� (con� ((equal� signa� 'empty?� (is-empty?)� ((equal� signa� 'push� (pus� (ca� args
25) , 27)
equal� signa� 'pop� (pop)� ((equal� signa� 'top� (top)� (els� (erro� “unknow� signal”
26)
stac� '()� (dept� 0)� (defin� is-empty� (lambd� (� …)� (defin� pus� (lambd� (elem� …)� (defin� po� (lambd� (� …)� (defin� to� (lambd� (� …)� (lambd� (signa� � args� (con� ((equal� signa� 'empty?� (is-empty?)� ((equal� signa� 'push� (pus� (ca� args
PAPR2/pp2a1.txt · Last modified: 2014/04/24 00:53 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0