Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp Implementation Other Languages Conclusion C++ Implementation shift(Window& 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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp Implementation Other Languages Conclusion C++ Implementation shift(Window& 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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Property Based Dispatch in Functional Languages Introduction Olena Properties Lisp Implementation Other Languages Conclusion Questions ? 19 / 19 Christopher Chedeau