Climb - Property-based dispatch in functional languages [Slides]
1. Property Based Dispatch
in Functional Languages
Property Based Dispatch in Functional Introduction
Olena Properties
Languages Lisp
Implementation
Other Languages
Conclusion
Christopher Chedeau
LRDE
Laboratoire de Recherche et D´veloppement d’EPITA
e
January 18, 2012
http://lrde.epita.fr/
1 / 19 Christopher Chedeau
2. Property Based Dispatch
in Functional Languages
Introduction Introduction
Olena Properties
Lisp
Implementation
Olena Properties
Other Languages
Conclusion
Lisp Implementation
Other Languages
Conclusion
2 / 19 Christopher Chedeau
3. Property Based Dispatch
in Functional Languages
Olena Properties
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
Type Name Values
image dimension any, one d, two d, three d
3 / 19 Christopher Chedeau
4. Property Based Dispatch
in Functional Languages
Shift Algorithm
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
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
C++ Implementation
shift(Window<W>& win, mln dpsite(W)& dp) { Introduction
Olena Properties
// Dispatch on definition property
Lisp
shift (mln trait window definition(W)(), exact(win), dp); Implementation
} Other Languages
Conclusion
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
Shift Algorithm
Introduction
Olena Properties
definition Lisp
Implementation
any unique multiple varying
Specialization (1) Ö Ö Ö Other Languages
Ö Ö Ö
Conclusion
Specialization (2)
size
any fixed
Specialization (1) Ö
Specialization (2)
6 / 19 Christopher Chedeau
7. Property Based Dispatch
in Functional Languages
C++ Implementation
shift(Window<W>& win, mln dpsite(W)& dp) { Introduction
Olena Properties
mlc is not(mln trait window definition(W),
Lisp
trait::window::definition::any)::check(); Implementation
mlc is not(mln trait window definition(W), Other Languages
trait::window::definition::varying)::check(); Conclusion
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
Lisp Implementation
Introduction
Olena Properties
Lisp
Implementation
Other Languages
(defmethod shift ( (defmethod shift (
Conclusion
(win window) (win window)
(dp dpsite)) (dp dpsite))
; Specialization (1) ; Specialization (2)
) )
8 / 19 Christopher Chedeau
9. Property Based Dispatch
in Functional Languages
Lisp Implementation
Introduction
Olena Properties
Lisp
(defalgo shift ( (defalgo shift ( Implementation
(win (win Other Languages
Conclusion
:properties ( :properties (
:definition :unique :definition :multiple)
:size :fixed) window)
window) (dp dpsite))
(dp dpsite)) ; Specialization (2)
; Specialization (1) )
)
9 / 19 Christopher Chedeau
10. Property Based Dispatch
in Functional Languages
Implementation Overview
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
10 / 19 Christopher Chedeau
11. Property Based Dispatch
in Functional Languages
Fibonacci
Introduction
Olena Properties
(defalgo fibo ((n
Lisp
(lambda (n) (< n 2)))) Implementation
n) Other Languages
Conclusion
11 / 19 Christopher Chedeau
12. Property Based Dispatch
in Functional Languages
Fibonacci
Introduction
Olena Properties
(defalgo fibo ((n
Lisp
(lambda (n) (< n 2)))) Implementation
n) Other Languages
Conclusion
(defun <2 (n) (< n 2))
(defalgo fibo ((n #’<2))
n)
11 / 19 Christopher Chedeau
13. Property Based Dispatch
in Functional Languages
Fibonacci
Introduction
Olena Properties
(defalgo fibo ((n (defun is (a)
Lisp
(lambda (n) (< n 2)))) (lambda (b) Implementation
n) (eq a b))) Other Languages
Conclusion
(defalgo fibo ((n (is 0)))
(defun <2 (n) (< n 2)) 0)
(defalgo fibo ((n #’<2)) (defalgo fibo ((n (is 1)))
n) 1)
11 / 19 Christopher Chedeau
14. Property Based Dispatch
in Functional Languages
Fibonacci
Introduction
Olena Properties
(defalgo fibo ((n (defun is (a)
Lisp
(lambda (n) (< n 2)))) (lambda (b) Implementation
n) (eq a b))) Other Languages
Conclusion
(defalgo fibo ((n (is 0)))
(defun <2 (n) (< n 2)) 0)
(defalgo fibo ((n #’<2)) (defalgo fibo ((n (is 1)))
n) 1)
(defalgo fibo (n)
(+ (fibo (− n 2)) (fibo (− n 1))))
11 / 19 Christopher Chedeau
15. Property Based Dispatch
in Functional Languages
Javascript Full Dispatch
Introduction
Olena Properties
Lisp
Implementation
fibo = FullDispatch() Other Languages
Conclusion
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
Python Decorators
Introduction
Olena Properties
Lisp
Implementation
@dispatch(inside(0, 1)) Other Languages
def fibo(n): Conclusion
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
Haskell Pattern Matching
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
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
MOP
Introduction
Olena Properties
Lisp
Implementation
(defmethod fibo (n)
Other Languages
(+ (fibo (− n 1)) (fibo (− n 2))))
Conclusion
(defmethod fibo ((n (eql 1)))
n)
(defmethod fibo ((n (eql 0)))
n)
15 / 19 Christopher Chedeau
19. Property Based Dispatch
in Functional Languages
Filtered Dispatch
Introduction
Olena Properties
(defun state (n) Lisp
Implementation
(if (< n 2)
Other Languages
’terminal Conclusion
’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
Multimethod.js
Introduction
Olena Properties
Lisp
fibo = multimethod() Implementation
.dispatch((n) −> if n < 2 Other Languages
’terminal’ Conclusion
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
Conclusion
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
Conclusion
18 / 19 Christopher Chedeau
22. Property Based Dispatch
in Functional Languages
Questions ?
Introduction
Olena Properties
Lisp
Implementation
Other Languages
Conclusion
19 / 19 Christopher Chedeau