Programming Languages Dan Grossman 2013 Optional: Dynamic Dispatch Manually in Racket.

Slides:



Advertisements
Similar presentations
1 Lecture 16: Tables and OOP. 2 Tables -- get and put.
Advertisements

CSE341: Programming Languages Lecture 2 Functions, Pairs, Lists Dan Grossman Winter 2013.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Winter 2013.
Fall 2008Programming Development Techniques 1 Topic 19 Mutable Data Objects Section 3.3.
CSE341: Programming Languages Lecture 21 Late Binding; OOP as a Racket Pattern Dan Grossman Fall 2011.
CSE341: Programming Languages Lecture 22 Multiple Inheritance, Interfaces, Mixins Dan Grossman Fall 2011.
CSE341: Programming Languages Lecture 26 Subtyping for OOP Dan Grossman Fall 2011.
CSE341: Programming Languages Lecture 15 Mutation, Pairs, Thunks, Laziness, Streams, Memoization Dan Grossman Fall 2011.
CSE341: Programming Languages Lecture 15 Macros Dan Grossman Spring 2013.
Cs1120 Fall 2009 David Evans Lecture 20: Programming with State.
Cs1120 Fall 2009 David Evans Lecture 19: Stateful Evaluation.
Programming LanguagesSection 71 Programming Languages Section 7. Ruby: Fundamentals Xiaojuan Cai Spring 2015.
CSE 341 Programming Languages Racket Datatype Style Programming Zach Tatlock Spring 2014.
CSE 413 Programming Languages & Implementation Hal Perkins Autumn 2012 Late binding and dynamic dispatch (Based on CSE 341 slides by Dan Grossman) 1.
Objects & Dynamic Dispatch CSE 413 Autumn Plan We’ve learned a great deal about functional and object-oriented programming Now,  Look at semantics.
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Winter 2013.
Programming Languages Dan Grossman 2013 Datatype-Programming in Racket Without Structs.
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 13 Racket Introduction
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Spring 2017.
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Winter 2013.
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Spring 2017.
Programming Languages Dan Grossman 2013
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Spring 2017.
6.001 SICP Object Oriented Programming
CSE341: Programming Languages Lecture 15 Macros
Programming Languages Dan Grossman 2013
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Winter 2013.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Spring 2013.
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Zach Tatlock Winter 2018.
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Zach Tatlock Winter 2018.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Spring 2017.
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Spring 2013.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Winter 2013.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Autumn 2018.
Lecture 15: Tables and OOP
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Spring 2016.
CSE 341 Section 7 Winter 2018 Adapted from slides by Eric Mullen, Nicholas Shahan, Dan Grossman, and Tam Dang.
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Zach Tatlock Winter 2018.
CSE341: Programming Languages Section 9 Dynamic Dispatch Manually in Racket Zach Tatlock Winter 2018.
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Autumn 2018.
Winter 2018 With thanks to: Dan Grossman / Eric Mullen
Lecture 16: Tables and OOP
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Zach Tatlock Winter 2018.
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Spring 2017.
Dan Grossman / Eric Mullen Autumn 2017
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Spring 2013.
Rehearsal: Lazy Evaluation Infinite Streams in our lazy evaluator
Brett Wortzman Summer 2019 Slides originally created by Dan Grossman
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 14 Thunks, Laziness, Streams, Memoization Dan Grossman Spring 2019.
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Spring 2019.
CSE341: Programming Languages Lecture 21 Dynamic Dispatch Precisely, and Manually in Racket Dan Grossman Spring 2019.
CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping Dan Grossman Spring 2019.
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Spring 2019.
Presentation transcript:

Programming Languages Dan Grossman 2013 Optional: Dynamic Dispatch Manually in Racket

Manual dynamic dispatch Now: Write Racket code with little more than pairs and functions that acts like objects with dynamic dispatch Why do this? –(Racket actually has classes and objects available) Demonstrates how one language's semantics is an idiom in another language Understand dynamic dispatch better by coding it up –Roughly how an interpreter/compiler might Analogy: Earlier optional material encoding higher-order functions using objects and explicit environments Jan-Mar 20132Dan Grossman, Programming Languages

Our approach Many ways to do it; our code does this: –An “object” has a list of field pairs and a list of method pairs –Field-list element example: (mcons 'x 17) –Method-list element example: (cons 'get-x (lambda (self args) …)) Notes: Lists sufficient but not efficient Not class-based: object has a list of methods, not a class that has a list of methods [could do it that way instead] Key trick is lambdas taking an extra self argument –All “regular” arguments put in a list args for simplicity Jan-Mar 20133Dan Grossman, Programming Languages (struct obj (fields methods))

A point object bound to x Jan-Mar 20134Dan Grossman, Programming Languages fieldsmethods x 'x mcar - 4 mcdr car cdr 'y mcar 0 mcdr car '() cdr 'get-x car cdr car cdr 'set-x car cdr car cdr 'distToOrigin car cdr car '() cdr … (self args)…

Key helper functions Now define plain Racket functions to get field, set field, call method Jan-Mar 20135Dan Grossman, Programming Languages (define (assoc-m v xs) …) ; assoc for list of mutable pairs (define (get obj fld) (let ([pr (assoc-m fld (obj-fields obj))])) (if pr (mcdr pr) (error …)))) (define (set obj fld v) (let ([pr (assoc-m fld (obj-fields obj))])) (if pr (set-mcdr! pr v) (error …)))) (define (send obj msg. args) (let ([pr (assoc msg (obj-methods obj))])) (if pr ((cdr pr) obj args) (error …))))

(send x 'distToOrigin) Jan-Mar 20136Dan Grossman, Programming Languages fieldsmethods x 'x mcar - 4 mcdr car cdr 'y mcar 0 mcdr car '() cdr 'get-x car cdr car cdr 'set-x car cdr car cdr 'distToOrigin car cdr car '() cdr … (self args)… Evaluate body of (self args)… with self bound to entire object (and args bound to '() )

Constructing points Plain-old Racket function can take initial field values and build a point object –Use functions get, set, and send on result and in “methods” –Call to self: (send self 'm …) –Method arguments in args list Jan-Mar 20137Dan Grossman, Programming Languages (define (make-point _x _y) (obj (list (mcons 'x _x) (mcons 'y _y)) (list (cons 'get-x ( (self args)(get self 'x))) (cons 'get-y ( (self args)(get self 'y))) (cons 'set-x ( (self args)(…))) (cons 'set-y ( (self args)(…))) (cons 'distToOrigin ( (self args)(…))))))

“Subclassing” Can use make-point to write make-color-point or make-polar-point functions (see code) Build a new object using fields and methods from “super” “constructor” –Add new or overriding methods to the beginning of the list send will find the first matching method –Since send passes the entire receiver for self, dynamic dispatch works as desired Jan-Mar 20138Dan Grossman, Programming Languages

Why not ML? We were wise not to try this in ML! ML's type system does not have subtyping for declaring a polar- point type that “is also a” point type –Workarounds possible (e.g., one type for all objects) –Still no good type for those self arguments to functions Need quite sophisticated type systems to support dynamic dispatch if it is not built into the language In fairness, languages with subtyping but not generics make it analogously awkward to write generic code Jan-Mar 20139Dan Grossman, Programming Languages