Vedlejší efekt
Imperativn� rys� p
r� programování funkcionální programování
zal ženo na postupná aplikace procedur (funkcí LISP Scheme ML Haskell
procedurální programování:
založeno na postupném vykonávání příkazů které mají vedlejší efekt
PASCAL FORTRAN
Trend: objektově orientované 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],…� � etin� soudobýc� PJ�
Jaké typy vedlejších efektů urozeznáváme:
Připomínáme� F je 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)� vim�
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� reen� 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�
vim� 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 nerozliitelné. Po zavedení vedlejího efektu ji tak tomu ale není. následující procedura ignoruje vechny 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 nerozliitelné (build-list 10 (lambda (x) x)) ; (0 1 2 3 4 5 6 7 8 9) m ueme je ale odliit 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 tie predpokládali, e map funguje odpredu pokud se zmení samotný map, nae reení 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ý� preruen� �
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� preruen� �
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� mylenka� 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�
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
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
u(lambd� (signa� � args� (con� ((equal� signa� 'empty?� (is-empty?)� ((equal� signa� 'push� (pus� (ca� args