Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Method Combinators
e ELS 2018 E
Didier Verna
EPITA / LRDE
didier@lrde.epita.fr
lrde/~didier
@didierverna didier.verna
google+
in/didierverna
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Introduction
I
CLOS improvements over mainstream object systems
I
Multiple dispatch
Increased SOC: polymorphism / inheritance
I
MOP
Homogeneous behavioral reection
I
Method combinations
Increased SOC: methods / dispatch
I
Standardization drawbacks
I
Method combinations underspecied
Considered not mature enough
I
MOP only a later addition
Unclear or contradictory protocols
Method Combinators / ELS 2018 Didier Verna 2/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 3/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 4/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Orthogonality
Short combination example
(defgeneric details (human)
(:method-combination append :most-specific-last)
(:method append ((human human)) ...)
(:method append ((employee employee)) ...))
I
Problems
I
Method qualication required
Combination change impractical
I
Except for the option
Inconsistent
I
No :before or :after methods
No good reason
I
Workaround: long method combinations
Method Combinators / ELS 2018 Didier Verna 5/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Structure
System classes
method-combination
<unspecied>
Abstract
I
Portable specialization impossible
At least one implementation-specic (sub)class
I
Unclear nature (classes vs. instances)
Mix of dene / call-time parametrization
Method Combinators / ELS 2018 Didier Verna 6/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Protocols
Lookup (MOP)
find-method-combination gf name options
I
“called to determine the combination object used by a
generic function”
I
What are name and options for?
I
Error behavior?
I
There already is generic-function-method-combination
Method Combinators / ELS 2018 Didier Verna 7/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Protocols (cont.)
Generic function invocation protocol (MOP)
compute-effective-method gf combination methods
I
What is combination for?
I
Caching policy unspecied
Contrary to applicable methods
Method Combinators / ELS 2018 Didier Verna 8/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 9/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Classes
Method combination classes hierarchy
standard-method-combination
type-name
options
short-method-combination
operator
identity-with-one-argument
long-method-combination
function
args-lambda-list
I
options: use-time (:method-combination options)
I
Below: dene-time
Method Combinators / ELS 2018 Didier Verna 10/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Short Method Combinations
Creation
(define-method-combination name option*)
(find-method-combination ///gf (eql name) options)
short combination object
I
No global namespace
I
One method combination object per generic function
I
Redenitions don’t aect existing generic functions
I
find-method-combination 6= the expected or the specied
Method Combinators / ELS 2018 Didier Verna 11/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Long Method Combinations
Long method combination functions
*long-method-combination-functions*
long-method-combination
function
args-lambda-list
I
Similar behavior, one additional oddity
I
Local method combination objects
I
Global method combination functions
Method Combinators / ELS 2018 Didier Verna 12/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Long Method Combinations (cont.)
Code
(define-method-combination my-progn ()
((primary () :order :most-specific-first :required t))
`(progn ,@(mapcar (lambda (method)
`(call-method ,method))
primary)))
(defgeneric test (i) (:method-combination my-progn)
(:method ((i number)) (print 'number))
(:method ((i fixnum)) (print 'fixnum)))
REPL
CL-USER> (test 1)
FIXNUM
NUMBER
Method Combinators / ELS 2018 Didier Verna 13/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Long Method Combinations (cont.)
Code
(define-method-combination my-progn ()
((primary () :order :most-specific-last :required t))
`(progn ,@(mapcar (lambda (method)
`(call-method ,method))
primary)))
.
REPL
CL-USER> (test 1)
FIXNUM
NUMBER
Method Combinators / ELS 2018 Didier Verna 13/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Long Method Combinations (cont.)
Code
(defmethod test ((i float)) (print 'float))
.
REPL
CL-USER> (test 1.5) CL-USER> (test 1)
NUMBER FIXNUM
FLOAT NUMBER
Method Combinators / ELS 2018 Didier Verna 13/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 14/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Overview
Classes
method-combinator-mixin
clients
short-method-combination
long-method-combination
short-method-combinator long-method-combinator
I
Stored in a global hash table
I
[setf] find-method-combinator
Method Combinators / ELS 2018 Didier Verna 15/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Protocols
In 3 layers
define-[short|long]-method-combinator
ensure-[short|long]-method-combinator
ensure-[short|long]-method-combinator-using-class
Method Combinators / ELS 2018 Didier Verna 16/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Implementation (layer 3)
In 4 steps
dene a regular combination
retrieve it
(find-method-combination)
make it combinator
(change-class)
store it
(setf find-method-combinator)
I
Note: regular combination injection
Method Combinators / ELS 2018 Didier Verna 17/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 18/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Overview
Classes
standard-generic-function
funcallable-standard-class
combined-generic-function
functions
«instanceof»
Wrappers
(defcombined cgf (args...)
(:method-combinator mc)
...)
Method Combinators / ELS 2018 Didier Verna 19/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Method Combinator Management
I
Initialization
(defmethod find-method-combination (cgf-class-prototype ...)
(find-method-combinator ...))
I
Sanitation
(defmethod find-method-combination (cgf ...)
(method-combinator cfg) #|or mismatch error|# )
I
Updating
(change-method-combinator cgf method-combinator)
Method Combinators / ELS 2018 Didier Verna 20/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Client Maintenance
method-combinator-mixin
clients
cgfcgf cgf
I
Client registration:
([re]initialize-instance cgf ...)
I
Client updating:
(reinitialize-instance mc ...)
(u-i-f-d-c mc ...)
New protocol
make-clients-obsolete
update-combined-generic-function-for-redefined-method-combinator
Method Combinators / ELS 2018 Didier Verna 21/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 22/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Overview
I
Idea: generic functions / combinators complete decoupling
I
Use: 6= logical method combinations, selected methods etc.
I
Note: already possible, but extremely costly
I
2 calls to reinitialize-instance
Protocols
(call-with-combinator (find-method-combinator 'combinator)
#'func arg1 arg2 ...)
(call/cb combinator func arg1 arg2 ...)
#!combinator(func arg1 arg2 ...)
Method Combinators / ELS 2018 Didier Verna 23/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Optimization
combined-generic-function
functions
dfdf df
I
Discriminating functions caches
I
Client maintenance aware of them
I
Cost
I
First alternative call: as before
I
Next: 1 or 2 hashtable lookups
I
Warning: discriminating functions must close over all caches!
Method Combinators / ELS 2018 Didier Verna 24/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Plan
Method Combinations Issues
The Case of SBCL
Method Combinators
Combined Generic Functions
Alternative Combinators
Performance
Method Combinators / ELS 2018 Didier Verna 25/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Performance
0
1
2
3
4
5
6
Numeric (10e8 iterations) I/O (10e7 iterations)
(seconds)
std
:std
+
:+
alt. :+
std
:std
progn
:progn
alt. :progn
Method Combinators / ELS 2018 Didier Verna 26/27
Introduction Issues
SBCL
Combinators CGFs Alt. MCs
Perfs
Conclusion
Conclusion / Perspectives
I
Conclusion
I
Method combinations are powerful yet underspecied
I
Method combinators improve their consistency
I
Code available on GitHub
I
Perspectives
I
Rene / properly package implementation
I
Port to other compilers
I
Experiment with “oating” oating methods
Method Combinators / ELS 2018 Didier Verna 27/27