In case method classes want to introduce keyword arguments from
somewhere other than the obvious direct methods, there's now a separate
bit of protocol for determining the lists of keyword arguments which
need to be merged together.
method-entry-function-name generic
method-entry-function-type generic
method-entry-slot-name generic
method-entry-function-name generic
method-entry-function-type generic
method-entry-slot-name generic
+ method-keyword-argument-lists generic
primary-method-class generic
simple-method-body generic
sod-message-argument-tail generic
primary-method-class generic
simple-method-body generic
sod-message-argument-tail generic
method-entry
method-entry-slot-name
method-entry
method-entry
method-entry-slot-name
method-entry
+method-keyword-argument-lists
+ effective-method t
module-dependencies
module
(setf module-dependencies)
module-dependencies
module
(setf module-dependencies)
\begin{describe}{gf}{primary-method-class @<message> @> @<class>}
\end{describe}
\begin{describe}{gf}{primary-method-class @<message> @> @<class>}
\end{describe}
+\begin{describe}{gf}
+ {method-keyword-argument-lists @<method> @<direct-methods> @> @<list>}
+\end{describe}
+
\begin{describe}{gf}
{compute-sod-effective-method @<message> @<class> @> @<method>}
\end{describe}
\begin{describe}{gf}
{compute-sod-effective-method @<message> @<class> @> @<method>}
\end{describe}
;;;--------------------------------------------------------------------------
;;; Effective method classes.
;;;--------------------------------------------------------------------------
;;; Effective method classes.
+(defmethod method-keyword-argument-lists
+ ((method effective-method) direct-methods)
+ (with-slots (message) method
+ (and (keyword-message-p message)
+ (mapcar (lambda (m)
+ (let ((type (sod-method-type m)))
+ (cons (c-function-keywords type)
+ (format nil "method for ~A on ~A (at ~A)"
+ message
+ (sod-method-class m)
+ (file-location m)))))
+ direct-methods))))
+
(defmethod shared-initialize :after
((method effective-method) slot-names &key direct-methods)
(declare (ignore slot-names))
;; Set the keyword argument list.
(with-slots (message keywords) method
(defmethod shared-initialize :after
((method effective-method) slot-names &key direct-methods)
(declare (ignore slot-names))
;; Set the keyword argument list.
(with-slots (message keywords) method
- (setf keywords (and (keyword-message-p message)
- (merge-keyword-lists
- (mapcar (lambda (m)
- (let ((type (sod-method-type m)))
- (cons (c-function-keywords type)
- (format nil "method for ~A on ~A"
- message
- (sod-method-class m)))))
- direct-methods))))))
+ (setf keywords
+ (merge-keyword-lists (method-keyword-argument-lists
+ method direct-methods)))))
(export '(basic-effective-method
effective-method-around-methods effective-method-before-methods
(export '(basic-effective-method
effective-method-around-methods effective-method-before-methods
This protocol is used by `simple-message' subclasses."))
This protocol is used by `simple-message' subclasses."))
+(export 'method-keyword-argument-lists)
+(defgeneric method-keyword-argument-lists (method direct-methods)
+ (:documentation
+ "Returns a list of keyword argument lists to be merged.
+
+ This should return a list suitable for passing to `merge-keyword-lists',
+ i.e., each element should be a pair consisting of a list of `argument'
+ objects and a string describing the source of the argument list."))
+
(export 'compute-sod-effective-method)
(defgeneric compute-sod-effective-method (message class)
(:documentation
(export 'compute-sod-effective-method)
(defgeneric compute-sod-effective-method (message class)
(:documentation