61a lecture 18
play

61A Lecture 18 Friday, March 6 Announcements 2 Announcements - PowerPoint PPT Presentation

61A Lecture 18 Friday, March 6 Announcements 2 Announcements Project 3 due Thursday 3/12 @ 11:59pm (get started now!) 2 Announcements Project 3 due Thursday 3/12 @ 11:59pm (get started now!) Project party on Tuesday 3/10


  1. 61A Lecture 18 Friday, March 6

  2. Announcements 2

  3. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) 2

  4. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB 2

  5. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB § Bonus point for early submission by Wednesday 3/11 2

  6. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB § Bonus point for early submission by Wednesday 3/11 • Homework 6 due Monday 3/16 @ 11:59pm (not yet released) 2

  7. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB § Bonus point for early submission by Wednesday 3/11 • Homework 6 due Monday 3/16 @ 11:59pm (not yet released) • Midterm 2 is on Thursday 3/19 7pm-9pm 2

  8. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB § Bonus point for early submission by Wednesday 3/11 • Homework 6 due Monday 3/16 @ 11:59pm (not yet released) • Midterm 2 is on Thursday 3/19 7pm-9pm § Emphasis: mutable data, object-oriented programming, recursion, and recursive data 2

  9. Announcements • Project 3 due Thursday 3/12 @ 11:59pm (get started now!) § Project party on Tuesday 3/10 5pm-6:30pm in 2050 VLSB § Bonus point for early submission by Wednesday 3/11 • Homework 6 due Monday 3/16 @ 11:59pm (not yet released) • Midterm 2 is on Thursday 3/19 7pm-9pm § Emphasis: mutable data, object-oriented programming, recursion, and recursive data § Fill out conflict form if you cannot attend due to a course conflict 2

  10. Hog Contest Results 3

  11. Hog Contest Results Excellent participation! 51 qualified submissions Lots of excellent ideas 3

  12. Hog Contest Results Excellent participation! 51 qualified submissions Lots of excellent ideas 3

  13. Hog Contest Results Excellent participation! 51 qualified submissions Lots of excellent ideas (Results) 3

  14. Type Coercion

  15. Review: Type Dispatching Analysis Minimal violation of abstraction barriers: we define cross-type functions as necessary. Extensible: Any new numeric type can "install" itself into the existing system by adding new entries to the cross-type function dictionaries 5

  16. Review: Type Dispatching Analysis Minimal violation of abstraction barriers: we define cross-type functions as necessary. Extensible: Any new numeric type can "install" itself into the existing system by adding new entries to the cross-type function dictionaries Arg 1 Arg 2 Add Multiply Complex Complex Rational Rational Complex Rational Rational Complex 5

  17. Coercion 6

  18. Coercion Idea: Some types can be converted into other types 6

  19. Coercion Idea: Some types can be converted into other types Takes advantage of structure in the type system 6

  20. Coercion Idea: Some types can be converted into other types Takes advantage of structure in the type system def rational_to_complex(r): """Return complex equal to rational.""" return ComplexRI(r.numer/r.denom, 0) 6

  21. Coercion Idea: Some types can be converted into other types Takes advantage of structure in the type system def rational_to_complex(r): """Return complex equal to rational.""" return ComplexRI(r.numer/r.denom, 0) Question: Can any numeric type be coerced into any other? 6

  22. Coercion Idea: Some types can be converted into other types Takes advantage of structure in the type system def rational_to_complex(r): """Return complex equal to rational.""" return ComplexRI(r.numer/r.denom, 0) Question: Can any numeric type be coerced into any other? Question: Can any two numeric types be coerced into a common type? 6

  23. Coercion Idea: Some types can be converted into other types Takes advantage of structure in the type system def rational_to_complex(r): """Return complex equal to rational.""" return ComplexRI(r.numer/r.denom, 0) Question: Can any numeric type be coerced into any other? Question: Can any two numeric types be coerced into a common type? Question: Is coercion exact? 6

  24. Applying Operators with Coercion 7

  25. Applying Operators with Coercion class Number: 7

  26. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) return x.add(y) 7

  27. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method 7

  28. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): 7

  29. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): if self.type_tag == other.type_tag: return self, other 7

  30. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other 7

  31. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: 7

  32. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: coercions = {('rat', 'com'): rational_to_complex} 7

  33. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: return (self.coerce_to(other.type_tag), other) coercions = {('rat', 'com'): rational_to_complex} 7

  34. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: return (self.coerce_to(other.type_tag), other) def coerce_to(self, other_tag): coercion_fn = self.coercions[(self.type_tag, other_tag)] return coercion_fn(self) coercions = {('rat', 'com'): rational_to_complex} 7

  35. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: return (self.coerce_to(other.type_tag), other) elif (other.type_tag, self.type_tag) in self.coercions: return (self, other.coerce_to(self.type_tag)) def coerce_to(self, other_tag): coercion_fn = self.coercions[(self.type_tag, other_tag)] return coercion_fn(self) coercions = {('rat', 'com'): rational_to_complex} 7

  36. Applying Operators with Coercion class Number: def __add__(self, other): x, y = self.coerce(other) Always defer to return x.add(y) add method def coerce(self, other): Same interface: 
 if self.type_tag == other.type_tag: no change required return self, other elif (self.type_tag, other.type_tag) in self.coercions: return (self.coerce_to(other.type_tag), other) elif (other.type_tag, self.type_tag) in self.coercions: return (self, other.coerce_to(self.type_tag)) def coerce_to(self, other_tag): coercion_fn = self.coercions[(self.type_tag, other_tag)] return coercion_fn(self) coercions = {('rat', 'com'): rational_to_complex} (Demo) 7

  37. Coercion Analysis 8

  38. Coercion Analysis Minimal violation of abstraction barriers: we define cross-type coercion as necessary 8

  39. Coercion Analysis Minimal violation of abstraction barriers: we define cross-type coercion as necessary Requires that all types can be coerced into a common type 8

  40. Coercion Analysis Minimal violation of abstraction barriers: we define cross-type coercion as necessary Requires that all types can be coerced into a common type More sharing: All operators use the same coercion scheme 8

  41. Coercion Analysis Minimal violation of abstraction barriers: we define cross-type coercion as necessary Requires that all types can be coerced into a common type More sharing: All operators use the same coercion scheme Arg 1 Arg 2 Add Multiply Complex Complex Rational Rational Complex Rational Rational Complex 8

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend