Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Climb - Property-based dispatch in functional languages

vjeux
April 05, 2012
7.7k

Climb - Property-based dispatch in functional languages

vjeux

April 05, 2012
Tweet

Transcript

  1. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Property Based Dispatch in Functional Languages Christopher Chedeau LRDE Laboratoire de Recherche et D´ eveloppement d’EPITA January 18, 2012 http://lrde.epita.fr/ 1 / 19 Christopher Chedeau
  2. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Introduction Olena Properties Lisp Implementation Other Languages Conclusion 2 / 19 Christopher Chedeau
  3. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Olena Properties Type Name Values image dimension any, one d, two d, three d 3 / 19 Christopher Chedeau
  4. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Shift Algorithm definition any unique multiple varying Specialization (1) Specialization (2) size any fixed Specialization (1) Specialization (2) 4 / 19 Christopher Chedeau
  5. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion C++ Implementation shift(Window<W>& win, mln dpsite(W)& dp) { // Dispatch on definition property shift (mln trait window definition(W)(), exact(win), dp); } shift (trait::window::definition::unique, W& win, mln dpsite(W)& dp) { /* Specialized implementation (1) */ } shift (trait::window::definition::multiple, W& win, mln dpsite(W)& dp) { /* Specialized implementation (2) */ } 5 / 19 Christopher Chedeau
  6. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Shift Algorithm definition any unique multiple varying Specialization (1) Ö Ö Ö Specialization (2) Ö Ö Ö size any fixed Specialization (1) Ö Specialization (2) 6 / 19 Christopher Chedeau
  7. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion C++ Implementation shift(Window<W>& win, mln dpsite(W)& dp) { mlc is not(mln trait window definition(W), trait::window::definition::any)::check(); mlc is not(mln trait window definition(W), trait::window::definition::varying)::check(); shift (mln trait window definition(W)(), exact(win), dp); } shift (trait::window::definition::unique, W& win, mln dpsite(W)& dp) { mlc is(mln trait window size(W), trait::window::size::fixed)::check(); } 7 / 19 Christopher Chedeau
  8. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Lisp Implementation (defmethod shift ( (win window) (dp dpsite)) ; Specialization (1) ) (defmethod shift ( (win window) (dp dpsite)) ; Specialization (2) ) 8 / 19 Christopher Chedeau
  9. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Lisp Implementation (defalgo shift ( (win :properties ( :definition :unique :size :fixed) window) (dp dpsite)) ; Specialization (1) ) (defalgo shift ( (win :properties ( :definition :multiple) window) (dp dpsite)) ; Specialization (2) ) 9 / 19 Christopher Chedeau
  10. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Implementation Overview                                                                             10 / 19 Christopher Chedeau
  11. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Fibonacci (defalgo fibo ((n (lambda (n) (< n 2)))) n) 11 / 19 Christopher Chedeau
  12. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Fibonacci (defalgo fibo ((n (lambda (n) (< n 2)))) n) (defun <2 (n) (< n 2)) (defalgo fibo ((n #’<2)) n) 11 / 19 Christopher Chedeau
  13. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Fibonacci (defalgo fibo ((n (lambda (n) (< n 2)))) n) (defun <2 (n) (< n 2)) (defalgo fibo ((n #’<2)) n) (defun is (a) (lambda (b) (eq a b))) (defalgo fibo ((n (is 0))) 0) (defalgo fibo ((n (is 1))) 1) 11 / 19 Christopher Chedeau
  14. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Fibonacci (defalgo fibo ((n (lambda (n) (< n 2)))) n) (defun <2 (n) (< n 2)) (defalgo fibo ((n #’<2)) n) (defun is (a) (lambda (b) (eq a b))) (defalgo fibo ((n (is 0))) 0) (defalgo fibo ((n (is 1))) 1) (defalgo fibo (n) (+ (fibo (− n 2)) (fibo (− n 1)))) 11 / 19 Christopher Chedeau
  15. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Javascript Full Dispatch fibo = FullDispatch() fibo.add [(n) −> n < 2], (n) −> n fibo.add [null], (n) −> fibo(n − 1) + fibo(n − 2) 12 / 19 Christopher Chedeau
  16. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Python Decorators @dispatch(inside(0, 1)) def fibo(n): return n @dispatch(int) def fibo(n): return fibo(n − 1) + fibo(n − 2) 13 / 19 Christopher Chedeau
  17. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Haskell Pattern Matching fibo 0 = 0 fibo 1 = 1 fibo n = fibo (n − 1) + fibo (n − 2) 14 / 19 Christopher Chedeau
  18. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion MOP (defmethod fibo (n) (+ (fibo (− n 1)) (fibo (− n 2)))) (defmethod fibo ((n (eql 1))) n) (defmethod fibo ((n (eql 0))) n) 15 / 19 Christopher Chedeau
  19. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Filtered Dispatch (defun state (n) (if (< n 2) ’terminal ’general)) (defmethod fibo :filter :state ((n (eql ’terminal))) n) (defmethod factorial :filter :state ((n (eql ’general))) (+ (fibo (− n 1)) (fibo (− n 2)))) 16 / 19 Christopher Chedeau
  20. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Multimethod.js fibo = multimethod() .dispatch((n) −> if n < 2 ’terminal’ else ’general’) .when(’terminal’, (n) −> n) .when(’general’, (n) −> fibo(n − 1) + fibo(n − 2)) 17 / 19 Christopher Chedeau
  21. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Conclusion Conclusion 18 / 19 Christopher Chedeau
  22. Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp

    Implementation Other Languages Conclusion Questions ? 19 / 19 Christopher Chedeau