Closures & FunctionalProgramingThey are a block of code plus thebindings to the environment they camefrom (Ragusa Idiom).“...
Agenda EKON 06.11.2012• Closure as a Code Block• Long History• Dynamic Languages• Functional Programming Examples• Closure...
Code BlocksHow many times have you written a piece of code and thought “I wish I could reuse this block of code”?How many ...
Why Closures?Languages that support closures allow you to  define functions with very little syntax.  While this might not...
What‘s a closure ?Never touch a running system ?!://Calls n times a value:• python•• def n_times(a_thing)• return proc{ |n...
Closure Counter• def counter(start)   return proc {start *= 3}  endk = counter(1)g = counter(10)•   puts k.call # -> 3•   ...
Closure: Definition• Closures are reusable blocks of code that  capture the environment and can be passed  around as metho...
Closure time• def times(n):def _f(x): return x * nreturn _f• t3 = times(3)• print t3 #• print t3(7) # 21                  ...
Closure in Pythondef generate_power_func(n): def nth_power(x): //closure       return x**nreturn nth_power>>> raised_to_4 ...
History• Lisp started in 1959• Scheme as a dialect of Lisp  • One feature of the language was function-    valued expressi...
Dynamic LanguagesThe increase in importance of web services, however, has  made it possible to use dynamic languages (wher...
Closure in Math Optimization                         12/36
Function Pointers•   Possible Callback or Procedure Type•   Type       TMath_func = Procedure(var x: float); //Proc Type  ...
Anonymous Itype  TWriter = reference to procedure;var xt: TWriter;begin  xt:= procedure  begin     writeln(Display this Te...
Anonymous IItype  TIntegerConvertFunc = reference to function(s: string):integer; //Has a return typevar  myFunction: TInt...
DelegatesMethod Pointers (Object Organisation)•   ppform:= TForm.Create(self);•   with ppform do begin•    caption:= LEDBO...
Closure as Parameter• Consider the difference• def managers(emps)• return emps.select {|e| e.isManager}• end    Select is ...
Function ConclusionStep to Closure CallbackA block of code plus the bindings to the environment they came from.This is the...
Closure as Object• When a function is written enclosed in anotherfunction, it has full access to local variables from thee...
Closure as Callback• function AlertThisLater(message, timeout)   {     function fn() { alert(message); }     window.setTim...
Closure SEQ              21/36
Closure as Threadgroovy> Thread.start { (A..Z).each {sleep 100;                        println it} }groovy> Thread.start {...
Lambda Expression•   There are three main parts of a function.1. The parameter list2. The return type3. The method body•  ...
Closure Syntax Iprocedure OuterMethod;var upperScope: string;     procedure InnerMethod;     var innerScope: string;     b...
Closure Syntax IIprocedure TMyClass.DoCount;var j: integer;ShowCounter: TProc; // Method no longer has a parameter.begin S...
Syntax Schema>>> def outer(x):    ... def inner(y):       ... return x+y    ... return inner...• >>> customInner=outer(2)•...
Let‘s practice• 1• 11• 21• 1211• 111221• 312211• ???Try to find the next pattern, look for a rule or  logic behind !      ...
function runString(Vshow: string): string;var i: byte;Rword, tmpStr: string;cntr, nCount: integer;begincntr:=1; nCount:=0;...
After C.function charCounter(instr: string): string;var i, cntr: integer;     Rword: string;begincntr:= 1;Rword:= ;  for i...
Closure Advantage – We       can avoid:Bad Naming (no naming convention)Duplicated Code (side effects)Long Methods (to muc...
Refactoring ClosureUnit        Refactoring Function       DescriptionPackage     Rename Package             Umbenennen ein...
Case Study: The Polygraph•    Design Case Study PolypAn easy one states that only one statement should exists for every so...
Polyp DesignDependency Inversion                                      33/36
Final - $Closure Test                        34/36
Closure Links:•   http://gafter.blogspot.com/2007/01/definition-of-    closures.html•   Michael Bolin, “Closure: The Defin...
This is not The End:        Q&A?      max@kleiner.com      softwareschule.ch                          36/36
Upcoming SlideShare
Loading in …5
×

A closure ekon16

745 views
711 views

Published on

Closures and Functional Programming II

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
745
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

A closure ekon16

  1. 1. Closures & FunctionalProgramingThey are a block of code plus thebindings to the environment they camefrom (Ragusa Idiom).“Refactoring is improving the design of code after ithas been written” 1/36
  2. 2. Agenda EKON 06.11.2012• Closure as a Code Block• Long History• Dynamic Languages• Functional Programming Examples• Closures & Refactoring• Case Study Experiences with a Polygraph Design• Links 2/36
  3. 3. Code BlocksHow many times have you written a piece of code and thought “I wish I could reuse this block of code”?How many times have you refactored existing code to remove redundancies?How many times have you written the same block of code more than once before realising that an abstraction exists? 3/36
  4. 4. Why Closures?Languages that support closures allow you to define functions with very little syntax. While this might not seem an important point, I believe its crucial - its the key to make it natural to use them frequently. Look at Lisp, Smalltalk, or Ruby code and youll see closures all over the place. UEB: demos/threads/thrddemo.exe 4/36
  5. 5. What‘s a closure ?Never touch a running system ?!://Calls n times a value:• python•• def n_times(a_thing)• return proc{ |n| a_thing * n}• end• c1 = n_times(23)• puts c1.call(1) # -> 23• puts c1.call(3) # -> 69 5/36
  6. 6. Closure Counter• def counter(start) return proc {start *= 3} endk = counter(1)g = counter(10)• puts k.call # -> 3• puts k.call # -> 9• puts g.call # -> 30• puts k.call # -> 27 UEB: 8_pas_verwechselt.txt 6/36
  7. 7. Closure: Definition• Closures are reusable blocks of code that capture the environment and can be passed around as method arguments for immediate or deferred execution.• Simplification: Your classes are small and your methods too; you’ve said everything and you’ve removed the last piece of unnecessary code. 7/36
  8. 8. Closure time• def times(n):def _f(x): return x * nreturn _f• t3 = times(3)• print t3 #• print t3(7) # 21 8/36
  9. 9. Closure in Pythondef generate_power_func(n): def nth_power(x): //closure return x**nreturn nth_power>>> raised_to_4 = generate_power_func(4)debug:id(raised_to_4) == 0x00C47561 == id(nth_power)).>>> raised_to_4(2) 16 9/36
  10. 10. History• Lisp started in 1959• Scheme as a dialect of Lisp • One feature of the language was function- valued expressions, signified by lambda.• Smalltalk with Blocks.• Lisp used something called dynamic scoping. 10/36
  11. 11. Dynamic LanguagesThe increase in importance of web services, however, has made it possible to use dynamic languages (where types are not strictly enforced at compile time) for large scale development. Languages such as Python, Ruby, Delphi and PHP.Scheme was the first language to introduce closures, allowing full lexical scoping, simplifying many types of programming style. to discuss: for i:= 0 to SourceTable.FieldCount - 1 do DestTable.Fields[i].Assign(SourceTable.Fields[i]); DestTable.Post; 11/36
  12. 12. Closure in Math Optimization 12/36
  13. 13. Function Pointers• Possible Callback or Procedure Type• Type TMath_func = Procedure(var x: float); //Proc Type procedure fct1(var x: float); //Implement begin x:= Sin(x); end;• var• fct1x:= @fct1 //Reference• fct_table(0.1, 0.7, 0.4, fct1x); //Function as Parameter• fct_table(0.1, 0.7, 0.4, @fct1); //alternativ direct 271_closures_study_workingset2.txt 13/36
  14. 14. Anonymous Itype TWriter = reference to procedure;var xt: TWriter;begin xt:= procedure begin writeln(Display this Text Ext); end; xt;readln;end; 14/36
  15. 15. Anonymous IItype TIntegerConvertFunc = reference to function(s: string):integer; //Has a return typevar myFunction: TIntegerConvertFunc;begin myfunction:= function(s: string): integer begin result:= IntToStr(s); end;// ... 15/36
  16. 16. DelegatesMethod Pointers (Object Organisation)• ppform:= TForm.Create(self);• with ppform do begin• caption:= LEDBOX, click to edit, dblclick write out pattern+• Press <Return> to run the Sentence;• width:= (vx*psize)+ 10 + 300;• height:= (vy*psize)+ 30;• BorderStyle:= bsDialog;• Position:= poScreenCenter;• OnKeyPress:= @FormKeyPress• OnClick:= @Label1Click;• OnClose:= @closeForm;• Show;• end UEB: 15_pas_designbycontract.txt 16/36
  17. 17. Closure as Parameter• Consider the difference• def managers(emps)• return emps.select {|e| e.isManager}• end Select is a method defined on the Ruby collection class. It takes a block of code, a closure, as an argument.• In C or Pascal you think as a function pointer• In Java as an anonymous inner class• In Delphi or C# you would consider a delegate. 17/36
  18. 18. Function ConclusionStep to Closure CallbackA block of code plus the bindings to the environment they came from.This is the formal thing that sets closures apart from function pointers and similar techniques. UEB: 14_pas_primetest.txt 18/36
  19. 19. Closure as Object• When a function is written enclosed in anotherfunction, it has full access to local variables from theenclosing function; this feature is called lexical scoping.• Evaluating a closure expression produces a closureobject as a reference.• The closure object can later be invoked, which resultsin execution of the body, yielding the value of theexpression (if one was present) to the invoker. 19/36
  20. 20. Closure as Callback• function AlertThisLater(message, timeout) { function fn() { alert(message); } window.setTimeout(fn, timeout); } AlertThisLater("Hi, JScript", 3000); A closure is created containing the message parameter, fn is executed quite some time after the call to AlertThisLater has returned, yet fn still has access to the original content of message! 20/36
  21. 21. Closure SEQ 21/36
  22. 22. Closure as Threadgroovy> Thread.start { (A..Z).each {sleep 100; println it} }groovy> Thread.start { (1..26).each {sleep 100; println it} }>>> A>>> 1>>> B>>> 2 22/36
  23. 23. Lambda Expression• There are three main parts of a function.1. The parameter list2. The return type3. The method body• A Lambda expression is just a shorthand expression of these three elements. // C#• string s => Int.Parse(s) 23/36
  24. 24. Closure Syntax Iprocedure OuterMethod;var upperScope: string; procedure InnerMethod; var innerScope: string; begin // Here, upperScope and innerScope are visible. // lowerScope is not visible. writeln(text); end;var lowerScope: string;begin// upperScope and lowerScope are visible here. InnerMethod;end; 24/36
  25. 25. Closure Syntax IIprocedure TMyClass.DoCount;var j: integer;ShowCounter: TProc; // Method no longer has a parameter.begin ShowCounter:= procedure begin // j is known here because it is wrapped in a closure // and made available to us! writeln(IntToStr(j)); end; for j:= 1 to 10 do ShowCounter; // j is no longer passedend; 25/36
  26. 26. Syntax Schema>>> def outer(x): ... def inner(y): ... return x+y ... return inner...• >>> customInner=outer(2)• >>> customInner(3)• result: 5 26/36
  27. 27. Let‘s practice• 1• 11• 21• 1211• 111221• 312211• ???Try to find the next pattern, look for a rule or logic behind ! 27/36
  28. 28. function runString(Vshow: string): string;var i: byte;Rword, tmpStr: string;cntr, nCount: integer;begincntr:=1; nCount:=0; Before C.Rword:=; //initializetmpStr:=Vshow; // input last resultfor i:= 1 to length(tmpStr) do begin if i= length(tmpstr) then begin if (tmpStr[i-1]=tmpStr[i]) then cntr:= cntr +1; if cntr = 1 then nCount:= cntr Rword:= Rword + intToStr(ncount) + tmpStr[i] end else if (tmpStr[i]=tmpStr[i+1]) then begin cntr:= cntr +1; nCount:= cntr; end else begin if cntr = 1 then cntr:=1 else cntr:=1; //reinit counter! Rword:= Rword + intToStr(ncount) + tmpStr[i] //+ last char(tmpStr)end;end; // end for loopresult:=Rword; UEB: 9_pas_umlrunner.txtend; 28/36
  29. 29. After C.function charCounter(instr: string): string;var i, cntr: integer; Rword: string;begincntr:= 1;Rword:= ; for i:= 1 to length(instr) do begin //last number in line if i= length(instr) then concatChars() else if (instr[i]=instr[i+1]) then cntr:= cntr +1 else begin concatChars() //reinit counter! cntr:= 1; end; end; //for result:= Rword;end; UEB: 009_pas_umlrunner_solution_2step.txt 29/36
  30. 30. Closure Advantage – We can avoid:Bad Naming (no naming convention)Duplicated Code (side effects)Long Methods (to much code)Temporary Fields (confusion)Long Parameter List (Object is missing)Data Classes (no methods) • Large Class • Class with too many delegating methods • Coupled classes UEB: 33_pas_cipher_file_1.txt 30/36
  31. 31. Refactoring ClosureUnit Refactoring Function DescriptionPackage Rename Package Umbenennen eines PackagesPackage Move Package Verschieben eines PackagesClass Extract Superclass Aus Methoden, Eigenschaften eine Oberklasse erzeugen und verwendenClass Introduce Parameter Ersetzen eines Ausdrucks durch einen MethodenparameterClass Extract Method Extract a Codepassage or define a ClosureInterface Extract Interface Aus Methoden ein Interface erzeugenInterface Use Interface Erzeuge Referenzen auf Klasse mit Referenz auf implementierte SchnittstelleComponent Replace Inheritance with Ersetze vererbte Methoden durch Delegation Delegation in innere KlasseClass Encapsulate Fields Getter- und Setter einbauenModel Safe Delete Delete a class with reference 31/36
  32. 32. Case Study: The Polygraph• Design Case Study PolypAn easy one states that only one statement should exists for every source line, like next and put a Var lifetime as short as possible.Can you read (Yes-No)? if YES then OK if NO then you are a Liar!var Rec: TMyRec;begin .. with Rec do begin .. title:= ‘Hello Implikation; end;end; 32/36
  33. 33. Polyp DesignDependency Inversion 33/36
  34. 34. Final - $Closure Test 34/36
  35. 35. Closure Links:• http://gafter.blogspot.com/2007/01/definition-of- closures.html• Michael Bolin, “Closure: The Definitive Guide", OReilly Media; Auflage: 1 (20. Oktober 2010).• http://www.javac.info/• http://sourceforge.net/projects/maxbox/• Refactoring Martin Fowler (1999, Addison-Wesley)• http://www.softwareschule.ch/download/closures_report.pdf• http://www.refactoring.com 35/36
  36. 36. This is not The End: Q&A? max@kleiner.com softwareschule.ch 36/36

×