src/class-layout-impl.lisp: Abstract out `sod-message-applicable-methods'.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 9 Jul 2018 11:19:19 +0000 (12:19 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 9 Jul 2018 12:09:58 +0000 (13:09 +0100)
We shall want this more later.

doc/SYMBOLS
doc/layout.tex
src/class-layout-impl.lisp
src/method-proto.lisp

index 944a975..ff820f1 100644 (file)
@@ -544,6 +544,7 @@ method-proto.lisp
   method-keyword-argument-lists                 generic
   primary-method-class                          generic
   simple-method-body                            generic
+  sod-message-applicable-methods                generic
   sod-message-argument-tail                     generic
   sod-message-effective-method-class            generic
   sod-method-description                        generic
@@ -1514,6 +1515,8 @@ sod-initializer-slot
   sod-initializer
 sod-initializer-value
   sod-initializer
+sod-message-applicable-methods
+  sod-message sod-class
 sod-message-argument-tail
   basic-message
 sod-message-class
index b106aa4..952cec0 100644 (file)
 \end{describe*}
 
 \begin{describe}{gf}
+    {sod-message-applicable-methods @<message> @<class> @> list}
+\end{describe}
+
+\begin{describe}{gf}
     {sod-message-effective-method-class @<message> @> @<class>}
 \end{describe}
 
index 119996e..7ff4667 100644 (file)
            (sod-class-nickname (method-entry-chain-head entry))
            (method-entry-role entry))))
 
+(defmethod sod-message-applicable-methods
+    ((message sod-message) (class sod-class))
+  (mappend (lambda (super)
+            (remove message
+                    (sod-class-methods super)
+                    :key #'sod-method-message
+                    :test-not #'eql))
+          (sod-class-precedence-list class)))
+
 (defmethod compute-sod-effective-method
     ((message sod-message) (class sod-class))
-  (let ((direct-methods (mappend (lambda (super)
-                                  (remove message
-                                          (sod-class-methods super)
-                                          :key #'sod-method-message
-                                          :test-not #'eql))
-                                (sod-class-precedence-list class))))
+  (let ((direct-methods (sod-message-applicable-methods message class)))
     (make-instance (sod-message-effective-method-class message)
                   :message message
                   :class class
index f7f1f47..4a624c5 100644 (file)
    will be a list of applicable methods sorted in most-to-least specific
    order."))
 
+(export 'sod-message-applicable-methods)
+(defgeneric sod-message-applicable-methods (message class)
+  (:documentation
+   "Return a list of applicable methods for a MESSAGE.
+
+   The list contains all methods applicable for MESSAGE when sent to an
+   instance of CLASS, most specific first."))
+
 (export 'sod-message-effective-method-class)
 (defgeneric sod-message-effective-method-class (message)
   (:documentation