[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

who calls me & who do I call



Here are some answers to your questions, collected from a few developers:

    does anyone know how to access the who calls database?

The primitive is si:map-over-callers

    I want the results as a list. 

Here's an example of finding the callers of si:map-over-callers itself.
Evaluate it out of your zmail buffer using c-R to edit the mail and
c-sh-E to evaluate the marked region.

(let ((answer '()))
  (si:map-over-callers 'si:map-over-callers
		       (lambda (caller how)
			 (push (list caller how) answer)))
  answer)

    I also would like an inverse function which given
    a function spec can return the list of all other function specs
    which it calls. 

si:map-over-compiled-function-callees is the primitive.
(si:map-over-compiled-function-callees
  #'si:map-over-callers
  (lambda (caller callee how)
    (when (eq how ':function)
      (format t "~&~S calls ~S as a ~S~%"
	      (sys:function-name caller) callee how)))
  :external-references t :map-over-internal-functions-too t)

    Finally does anyone know of a function which
    can take a Zmacs buffer (or file) and return a list of all
    the specs of all functions (and methods and macros) defined in
    that buffer/file? 

(zwei:buffer-sections <buffer>) will return a list of objects that
respond to the :definition-type and :function-spec messages.
zwei:*interval* is the current buffer and zwei:find-buffer-named
is how you can find a buffer; the variable only is bound inside
of Zmacs, of course.

Here's an example showing how to do it for a file that has been
loaded:

(send (send #P"SYS:ZWEI;COMA.LISP.NEWEST" :generic-pathname) :get 'si:definitions)

None of this is a documented interface, so it could be changed
incompatibly in a future release.  I do not know of any plans to change
any of it, however.  Your profiling program sounds interesting, I wouldn't
mind seeing it.  Probably it would get a lot of use if donated to the SLUG
library.