[slime-devel] Definition Types
Terje Norderhaug
terje at in-progress.com
Sat Dec 26 22:37:53 UTC 2009
The find-definitions-for-emacs function returns a list of definition
specifiers (dspecs) associated with their source locations. The first
item in a dspec denotes its type.
Swank clients like SLIME and MCLIDE can benefit from reliably
determining the canonical type of a definition. However, the lisp
implementations differ in the number of definition types and how they
are named, and may also let users define custom definition types.
This ambiguity can be resolved by swank exposing information about
the semantics of the implementation specific definition types and the
relationship between them, such as:
(definterface definition-types ()
"Association list of definition type symbol, supertype(s), and
optional attributes inherited by subtypes, where an attribute can be
one of (:variable :class :method :function :macro) denoting the
semantics of the definition type."
'((variable nil :variable)
(constant (variable))
(function nil :function)
(macro (function) :macro)
(generic (function))
(method nil :method)
(class nil :class)
(condition (class))))
Here is a Clozure specific implementation that adapts to new
definition types:
(defimplementation definition-types ()
(loop
with semantics = '((variable :variable)(class :class)
(method :method)(function :function)
(macro :macro))
for (type . def) in ccl::*definition-types*
collect
(list*
type
(loop
for super in (class-direct-superclasses (class-of def))
for type = (car (rassoc (class-prototype super)
ccl::*definition-types*))
when (and type (neq 't type))
collect type)
(cdr (assoc type semantics))))
=>
((METHOD-COMBINATION-EVALUATOR NIL)
(PPC-LAP NIL)
(PPC32-VINSN NIL)
(PACKAGE NIL)
(CONSTANT (VARIABLE))
(VARIABLE NIL :VARIABLE)
(METHOD-COMBINATION NIL)
(DEFINITION-TYPE NIL)
(STRUCTURE NIL)
(CONDITION (CLASS))
(CLASS NIL :CLASS)
(TYPE NIL)
(STRUCTURE-ACCESSOR (FUNCTION))
(CALLBACK (FUNCTION))
(WRITER-METHOD (METHOD))
(READER-METHOD (METHOD))
(METHOD NIL :METHOD)
(GENERIC-FUNCTION (FUNCTION))
(SETF-EXPANDER (MACRO))
(SYMBOL-MACRO (MACRO))
(COMPILER-MACRO (MACRO))
(MACRO (FUNCTION) :MACRO)
(FUNCTION NIL :FUNCTION)
(T NIL))
Here is a sample implementation for SBCL:
(defimplementation definition-types ()
(loop
with semantics = '((defvar :variable)(defclass :class)
(defmethod :method)
(defun :function)(defmacro :macro))
with super = '((defconstant defvar)(define-condition defclass)
(defgeneric defun)
(define-compiler-macro defmacro)(defmacro defun))
for type in (cdr *definition-types*) by #'cddr
collect (list* type (cdr (assoc type super)) (cdr (assoc type
semantics))))
=>
((DEFVAR NIL :VARIABLE)
(DEFCONSTANT (DEFVAR))
(DEFTYPE NIL)
(DEFINE-SYMBOL-MACRO NIL)
(DEFMACRO (DEFUN) :MACRO)
(DEFINE-COMPILER-MACRO (DEFMACRO))
(DEFUN NIL :FUNCTION)
(DEFGENERIC (DEFUN))
(DEFMETHOD NIL :METHOD)
(DEFINE-SETF-EXPANDER NIL)
(DEFSTRUCT NIL)
(DEFINE-CONDITION (DEFCLASS))
(DEFCLASS NIL :CLASS)
(DEFINE-METHOD-COMBINATION NIL)
(DEFPACKAGE NIL)
(:DEFTRANSFORM NIL)
(:DEFOPTIMIZER NIL)
(:DEFINE-VOP NIL)
(:DEFINE-SOURCE-TRANSFORM NIL))
Here is a sample implementation for LispWorks:
(defimplementation definition-types ()
(loop
with semantics = '((defvar :variable)(defclass :class)
(method :method)
(defun :function)(defmacro :macro))
with super = '((defconstant defvar) (define-condition defclass)
(defgeneric defun) (compiler-macro defmacro)
(defmacro defun))
for type in dspec:*dspec-classes*
collect (list* type (cdr (assoc type super)) (cdr (assoc type
semantics)))))
=>
((CAPI:DEFINE-INTERFACE NIL)
(CAPI:DEFINE-LAYOUT NIL)
(CAPI-INTERNALS:DEFINE-ELEMENT NIL)
(CAPI-INTERNALS:DEFINE-AUTO-MENU NIL)
(CAPI:DEFINE-MENU NIL)
(EDITOR:DEFINE-TOP-LEVEL-FORM-PARSER NIL)
(EDITOR:DEFCOMMAND NIL)
(DEFSYSTEM NIL)
(EXTERNAL-FORMAT::EF-FUNCTION NIL)
(EXTERNAL-FORMAT:DEFINE-EXTERNAL-FORMAT-SYNONYM NIL)
(EXTERNAL-FORMAT:DEFINE-EXTERNAL-FORMAT NIL)
(FLI:DEFINE-FOREIGN-CALLABLE NIL)
(FLI:DEFINE-FOREIGN-VARIABLE NIL)
(FLI:DEFINE-FOREIGN-FUNCTION NIL)
(FLI:DEFINE-FOREIGN-TYPE NIL)
(FLI::FOREIGN-SYMBOL NIL)
(FLI::DEFRAW-IMMEDIATE-FOREIGN-TYPE NIL)
(SCM:DEFINE-PATCH-SEQUENCE NIL)
(COMPILER::ADVICE-DEFINITION NIL)
(COMPILER::ADVISED-FUNCTION-NAME NIL)
(SYSTEM:DEFASM NIL)
(METHOD-COMBINATION NIL)
(METHOD NIL :METHOD)
(DEFGENERIC (DEFUN))
(DEFINE-CONDITION (DEFCLASS))
(DEFCLASS NIL :CLASS)
(DEFRESOURCE NIL)
(PACKAGE NIL)
(DEFSETF NIL)
(STRUCTURE NIL)
(STRUCTURE-CLASS NIL)
(TYPE:TYPE-PREDICATE NIL)
(DEFTYPE NIL)
(TYPE NIL)
(COMPILER-MACRO (DEFMACRO))
(DEFMACRO (DEFUN) :MACRO)
(DEFUN NIL :FUNCTION)
(FUNCTION NIL)
(DEFINE-SYMBOL-MACRO NIL)
(DEFCONSTANT (DEFVAR))
(DEFVAR NIL :VARIABLE)
(VARIABLE NIL)
(DSPEC:DEFINE-FORM-PARSER NIL)
(DSPEC:DEFINE-DSPEC-ALIAS NIL)
(DSPEC:DEFINE-DSPEC-CLASS NIL))
-- Terje Norderhaug
terje at in-progress.com
More information about the slime-devel
mailing list