X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/84b9d17a506658db9f5100820aad88342502e641..8eb242b160e163a1cfc6e810aeda4788116bba1a:/src/method-proto.lisp diff --git a/src/method-proto.lisp b/src/method-proto.lisp index f7f1f47..5687802 100644 --- a/src/method-proto.lisp +++ b/src/method-proto.lisp @@ -49,6 +49,61 @@ 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-keyword-argument-lists) +(defgeneric sod-message-keyword-argument-lists + (message class direct-methods state) + (: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 function describing + the source of the argument list (returning location and description), and + a list of `argument' objects. + + The MESSAGE is the message being processed; CLASS is a receiver class + under consideration; DIRECT-METHODS is the complete list of applicable + direct methods (most specific first); and STATE is an `inheritance-path- + reporter-state' object which can be used by the returned reporting + functions.")) + +(export 'compute-effective-method-keyword-arguments) +(defun compute-effective-method-keyword-arguments + (message class direct-methods) + "Return a merged keyword argument list. + + The returned list combines all of the applicable methods, provided as + DIRECT-METHODS, applicable to MESSAGE when received by an instance of + CLASS, possibly with other keywords as determined by `sod-keyword- + argument-lists'." + (let ((state (make-inheritance-path-reporter-state class))) + (merge-keyword-lists (lambda () + (values class + (format nil + "methods for message `~A' ~ + applicable to class `~A'" + message class))) + (sod-message-keyword-argument-lists message + class + direct-methods + state)))) + +(export 'sod-message-check-methods) +(defgeneric sod-message-check-methods (message class direct-methods) + (:documentation + "Check that the applicable methods for a MESSAGE are compatible. + + Specifically, given the DIRECT-METHODS applicable for the message when + received by an instance of CLASS, signal errors if the methods don't + match the MESSAGE or each other.")) + (export 'sod-message-effective-method-class) (defgeneric sod-message-effective-method-class (message) (:documentation @@ -63,21 +118,6 @@ This protocol is used by `simple-message' subclasses.")) -(export 'method-keyword-argument-lists) -(defgeneric method-keyword-argument-lists (method direct-methods state) - (: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 function describing - the source of the argument list (returning location and description), and - a list of `argument' objects. - - The METHOD is the effective method being processed; DIRECT-METHODS is the - complete list of applicable direct methods (most specific first); and - STATE is an `inheritance-path-reporter-state' object which can be used by - the returned reporting functions.")) - (export 'compute-sod-effective-method) (defgeneric compute-sod-effective-method (message class) (:documentation