22
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

Climb - Property-based dispatch in functional languages [Slides]

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Property Based Dispatch in Functional

Languages

Christopher Chedeau

LRDELaboratoire de Recherche et Developpement d’EPITA

January 18, 2012

http://lrde.epita.fr/

1 / 19 Christopher Chedeau

Page 2: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Introduction

Olena Properties

Lisp Implementation

Other Languages

Conclusion

2 / 19 Christopher Chedeau

Page 3: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Olena Properties

Type Name Valuesimage dimension any, one d, two d, three d

3 / 19 Christopher Chedeau

Page 4: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Shift Algorithm

definitionany unique multiple varying

Specialization (1) XSpecialization (2) X

sizeany fixed

Specialization (1) XSpecialization (2) X X

4 / 19 Christopher Chedeau

Page 5: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

C++ Implementation

shift(Window<W>& win, mln dpsite(W)& dp) {// Dispatch on definition propertyshift (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

Page 6: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Shift Algorithm

definitionany unique multiple varying

Specialization (1) Ö X Ö Ö

Specialization (2) Ö Ö X Ö

sizeany fixed

Specialization (1) Ö XSpecialization (2) X X

6 / 19 Christopher Chedeau

Page 7: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 8: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 9: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 10: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Implementation Overview

10 / 19 Christopher Chedeau

Page 11: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 12: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 13: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 14: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 15: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 16: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 17: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Haskell Pattern Matching

fibo 0 = 0fibo 1 = 1fibo n = fibo (n − 1) + fibo (n − 2)

14 / 19 Christopher Chedeau

Page 18: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 19: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 20: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

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

Page 21: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Conclusion

I Conclusion

18 / 19 Christopher Chedeau

Page 22: Climb - Property-based dispatch in functional languages [Slides]

Property Based Dispatchin Functional Languages

Introduction

Olena Properties

LispImplementation

Other Languages

Conclusion

Questions ?

19 / 19 Christopher Chedeau