2013-01-11 10 views
6

Czy istnieje sposób na znalezienie wszystkich funkcji, które specjalizują się w danym typie?Znajdź wszystkie metody specjalizacji danego typu.

mogę sobie wyobrazić coś można wykonać z repl jak (find-all-specializing-methods 'my-class) i to zwróci listę metod jak (mypackage1:my-method-1 my-package2:my-method-2 etc.)

myślę, że musi być łatwym sposobem, aby to zrobić, ponieważ sama MOP prawdopodobnie musi przechowywać taki lista, aby zdecydować, które metody wywołać.

+2

MOP tak naprawdę tego nie potrzebuje. CLOS używa ZASTOSOWANYCH-METOD. –

+0

@wvxvw dziękuję, to jest wystarczająco blisko do moich celów, proszę zaksięguj jako odpowiedź, a ja to zaakceptuję. – tjb

Odpowiedz

5

Aby dowiedzieć się, że można zajrzeć do slime-who-specializes i dowiedzieć się, jak to zrobić dla swojej konfiguracji.

Po definicjach, mam tak daleko, jak tutaj (dla 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)) 

Ta funkcjonalność jest realizowana oddzielnie dla różnych Lisps, więc jeśli potrzebujesz konkretnych szczegółów, trzeba by zajrzeć do: swank-<your lisp>.lisp plik i wyszukaj implementację ogólnej funkcji who-specializes.

+0

Czy jest szansa, że ​​ktoś może trochę to zepsuć? Wystąpił błąd podczas próby podłączenia go do mojego slime toplevel: 'Funkcja SWANK/BACKEND :: SBCL-WITH-XREF-P jest niezdefiniowana. Nawet gdybym nie dostał tego błędu, chciałbym lepiej zrozumieć odpowiednie elementy . – lindes

Powiązane problemy