2013-01-11 13 views
6

Gibt es eine Möglichkeit, alle Funktionen zu finden, die auf einen bestimmten Typ spezialisiert sind?Finden Sie alle Methoden eines bestimmten Typs

Ich sehe etwas, das man von den ers wie (find-all-specializing-methods 'my-class) ausführen konnte, und es wäre eine Liste von Methoden wie (mypackage1:my-method-1 my-package2:my-method-2 etc.)

Ich denke, es zurückgeben muss eine einfache Möglichkeit, dies zu tun, weil die MOP selbst wahrscheinlich eine solche speichern muss Liste, um zu entscheiden, welche Methoden aufgerufen werden sollen.

+2

Das MOP braucht das nicht wirklich. CLOS verwendet COMPUTE-APPLICABLE-METHODS. –

+0

@wvxvw danke, das ist nahe genug für meine Zwecke, bitte posten als Antwort und ich werde es akzeptieren – tjb

Antwort

5

Um herauszufinden, dass Sie in slime-who-specializes suchen und finden Sie heraus, wie Sie es für Ihre Einrichtung tun können.

den Definitionen Nach bekam ich weit, so wie hier (für SBCL):

#+#.(swank-backend::sbcl-with-xref-p) 
(progn 
    (defmacro defxref (name &optional fn-name) 
    `(defimplementation ,name (what) 
     (sanitize-xrefs 
     (mapcar #'source-location-for-xref-data 
       (,(find-symbol (symbol-name (if fn-name 
               fn-name 
               name)) 
           "SB-INTROSPECT") 
        what))))) 
    (defxref who-calls) 
    (defxref who-binds) 
    (defxref who-sets) 
    (defxref who-references) 
    (defxref who-macroexpands) 
    #+#.(swank-backend:with-symbol 'who-specializes-directly 'sb-introspect) 
    (defxref who-specializes who-specializes-directly)) 

Diese Funktionalität separat für unterschiedliche Lisps implementiert ist, so dass, wenn Sie bestimmte Details benötigen, müssten Sie schauen: swank-<your lisp>.lisp Datei und Suche nach Implementierung von who-specializes generische Funktion.

+0

Jede Chance, jemand könnte dies ein wenig mehr brechen? Ich habe einen Fehler bekommen, indem ich versucht habe, das in meinen Slime-Toplevel zu stecken: 'Die Funktion SWANK/BACKEND :: SBCL-WITH-XREF-P ist undefiniert. Selbst wenn ich diesen Fehler nicht bekommen hätte, würde ich gerne die relevanten Teile besser verstehen . – lindes

Verwandte Themen