Thanks for any help.
- Jake
I'm sure wiser heads will post better solutions, but here's a piecewise
one that might help:
(defun symbol-function-p (sym)
"Is there a function associated with this symbol?"
(handler-case (symbol-function sym)
(undefined-function () nil)))
(defun defun-in-package-p (s p)
"Is this symbol interned in this package, and is there a
function asssociated with it?"
(and (symbol-function-p s)
(eq p (symbol-package s))))
(defun functions-in-package (pkg)
"Return a list of functions defined in the package PKG."
(loop for s being the symbols in pkg
when (defun-in-package-p s pkg)
collect s))
(defun document-package-functions (pkg)
"Print documentation of all functions defined in the package."
(loop for fnsym in (functions-in-package pkg)
do (princ (format nil "~a~%~a~%~%" fnsym
(or (documentation fnsym 'function) "")))))
;; then give it a try:
CL-USER> (document-package-functions (find-package :common-lisp))
DEFPARAMETER
Define a parameter that is not normally changed by the program,
but that may be changed without causing an error. Declare the
variable special and sets its value to VAL, overwriting any
previous value. The third argument is an optional documentation
string for the parameter.
SETF
Takes pairs of arguments like SETQ. The first is a place and the second
is the value that is supposed to go into that place. Returns the last
value. The place argument may be any of the access forms for which
SETF
knows a corresponding setting form.
CIS
Return cos(Theta) + i sin(Theta), i.e. exp(i Theta).
;;; etc
Graham
> jakemiles wrote:
>> Hello all. I'm completely confused no matter what I look at on the
>> internet or in Paul Graham's Ansi Common Lisp. I just want to obtain a
>> list of all functions defined in a package. Can someone show me a
>> clear example of how this is done? For example, what code would list
>> all the functions defined in common-lisp? Also, I'm not interested in
>> inherited functions, only those defined in the package itself.
>
> I'm sure wiser heads will post better solutions, but here's a piecewise
> one that might help:
>
> (defun symbol-function-p (sym)
> "Is there a function associated with this symbol?"
> (handler-case (symbol-function sym)
> (undefined-function () nil)))
Macros also have a symbol-function.
> (defun defun-in-package-p (s p)
> "Is this symbol interned in this package, and is there a
> function asssociated with it?"
> (and (symbol-function-p s)
> (eq p (symbol-package s))))
Well implementations may export from COMMON-LISP symbols that are
actually defined somewhere else and imported into COMMON-LISP...
(length (remove (find-package "COMMON-LISP")
(com.informatimago.common-lisp.package:package-exports "COMMON-LISP")
:key (function symbol-package)))
--> 54
Better use com.informatimago.common-lisp.package:package-exports to get the symbols
exported from a package...
http://darcs.informatimago.com/lisp/common-lisp/package.lisp
So, to get the list of the functions that are _exported_ from a package:
(defun package-functions (package)
(remove-if-not (lambda (x) (and (fboundp x) (not (macro-function x))))
(com.informatimago.common-lisp.package:package-exports package)))
(length (package-functions "COMMON-LISP"))
--> 660
--
__Pascal Bourguignon__ http://www.informatimago.com/
HEALTH WARNING: Care should be taken when lifting this product,
since its mass, and thus its weight, is dependent on its velocity
relative to the user.
GF> (defun symbol-function-p (sym)
GF> "Is there a function associated with this symbol?"
GF> (handler-case (symbol-function sym)
GF> (undefined-function () nil)))
why not just fboubdp?
)
(With-best-regards '(Alex Mizrahi) :aka 'killer_storm)
"People who lust for the Feel of keys on their fingertips (c) Inity")
Graham Fawcett wrote:
> jakemiles wrote:
>
>>Hello all. I'm completely confused no matter what I look at on the
>>internet or in Paul Graham's Ansi Common Lisp. I just want to obtain a
>>list of all functions defined in a package. Can someone show me a
>>clear example of how this is done? For example, what code would list
>>all the functions defined in common-lisp? Also, I'm not interested in
>>inherited functions, only those defined in the package itself.
>
>
> I'm sure wiser heads will post better solutions, but here's a piecewise
> one that might help:
>
> (defun symbol-function-p (sym)
> "Is there a function associated with this symbol?"
> (handler-case (symbol-function sym)
> (undefined-function () nil)))
fboundp?
>
> (defun defun-in-package-p (s p)
> "Is this symbol interned in this package, and is there a
> function asssociated with it?"
> (and (symbol-function-p s)
> (eq p (symbol-package s))))
I would expect something named defun-xxxx to be a variant on defun. One
is not looking for defuns in a package, one is looking for functions.
One does not call a defun, once calls a function. etc etc.
>
> (defun functions-in-package (pkg)
> "Return a list of functions defined in the package PKG."
> (loop for s being the symbols in pkg
> when (defun-in-package-p s pkg)
fboundp?
You already know s is a symbol in pkg, so why does dipp have to check
the package of the symbol?
kt
> collect s))
>
> (defun document-package-functions (pkg)
> "Print documentation of all functions defined in the package."
> (loop for fnsym in (functions-in-package pkg)
> do (princ (format nil "~a~%~a~%~%" fnsym
> (or (documentation fnsym 'function) "")))))
>
> ;; then give it a try:
>
> CL-USER> (document-package-functions (find-package :common-lisp))
> DEFPARAMETER
> Define a parameter that is not normally changed by the program,
> but that may be changed without causing an error. Declare the
> variable special and sets its value to VAL, overwriting any
> previous value. The third argument is an optional documentation
> string for the parameter.
>
> SETF
> Takes pairs of arguments like SETQ. The first is a place and the second
> is the value that is supposed to go into that place. Returns the last
> value. The place argument may be any of the access forms for which
> SETF
> knows a corresponding setting form.
>
> CIS
> Return cos(Theta) + i sin(Theta), i.e. exp(i Theta).
>
> ;;; etc
>
> Graham
>
--
Cells: http://common-lisp.net/project/cells/
"I'll say I'm losing my grip, and it feels terrific."
-- Smiling husband to scowling wife, New Yorker cartoon
> Well implementations may export from COMMON-LISP symbols that are
> actually defined somewhere else and imported into COMMON-LISP...
However the test for the symbol-package of the symbol being the package
you're looking at tells you just that.
Ignorance of its existence. ;-) Thank you.
Graham
Thanks. I knew I must be reinventing something, just didn't know what.
;-)
> > (defun defun-in-package-p (s p)
> > "Is this symbol interned in this package, and is there a
> > function asssociated with it?"
> > (and (symbol-function-p s)
> > (eq p (symbol-package s))))
>
> I would expect something named defun-xxxx to be a variant on defun. One
> is not looking for defuns in a package, one is looking for functions.
> One does not call a defun, once calls a function. etc etc.
Good point.
> > (defun functions-in-package (pkg)
> > "Return a list of functions defined in the package PKG."
> > (loop for s being the symbols in pkg
> > when (defun-in-package-p s pkg)
>
> fboundp?
> You already know s is a symbol in pkg, so why does dipp have to check
> the package of the symbol?
The OP wanted functions that were defined in-package, not imported into
it. Actually, I expected the "being the symbols" clause not to include
imported symbols, but it appears to; at least for me, over here in
SBCL. Check out SB-ALIEN, for example:
CL-USER> (loop with set = '()
for s being the symbols in (find-package :SB-ALIEN)
and p = (symbol-package s)
do (pushnew (package-name p) set)
finally (return set))
("SB-EXT" "SB-INT" "SB-ALIEN-INTERNALS" "SB-SYS" "SB-ALIEN"
"COMMON-LISP")
--g
> Macros also have a symbol-function.
I didn't know that. Thanks.
> So, to get the list of the functions that are _exported_ from a package:
>
> (defun package-functions (package)
> (remove-if-not (lambda (x) (and (fboundp x) (not (macro-function x))))
> (com.informatimago.common-lisp.package:package-exports package)))
LOOP has a "being the external-symbols" clause; I think this would do
the same thing, right?
(flet ((test (x) (and (fboundp x)
(not (macro-function x)))))
(loop for s being the external-symbols in (find-package :common-lisp)
when (test s) count s))
--> 661
You got 660; I wonder what my 661st function is...
--g
Using:
(FLET ((TEST (X)
(AND (FBOUNDP X) (NOT (MACRO-FUNCTION X)))))
(LOOP FOR S BEING THE EXTERNAL-SYMBOLS IN (FIND-PACKAGE :COMMON-LISP) WHEN
(TEST S) COLLECT S))
in these implementations:
CLISP 2.41 (2006-10-13) (built 3372383352) (memory 3372383930)
SBCL 0.9.18
CMU Common Lisp 19c (19C)
GNU Common Lisp (GCL) GCL 2.6.7
ECL 0.9g
International Allegro CL Free Express Edition 8.0 [Linux (x86)] (Jun 6, 2006 16:01)
(sorry to use some oldish versions of some of these lisp implemenations),
to collect the symbols that are external in CL and bound to a function
but not a macro, we get:
(loop :for a :in '(clisp sbcl cmucl gcl ecl acl)
:do (loop :for b :in '(clisp sbcl cmucl gcl ecl acl)
:initially (format t "~%|~A| = ~A~%" a (length (symbol-value a)))
:do (when (set-difference (symbol-value a) (symbol-value b))
(format t "~%"))
(com.informatimago.common-lisp.interactive::flow-list
(format nil "~A - ~A = " a b)
(set-difference (symbol-value a) (symbol-value b)))))
|CLISP| = 660
CLISP - GCL = ARITHMETIC-ERROR-OPERANDS BROADCAST-STREAM-STREAMS
CELL-ERROR-NAME COMPILER-MACRO-FUNCTION
CONCATENATED-STREAM-STREAMS COPY-PPRINT-DISPATCH
DESCRIBE-OBJECT ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ENSURE-DIRECTORIES-EXIST
FDEFINITION FILE-STRING-LENGTH FIND-METHOD
FUNCTION-LAMBDA-EXPRESSION GET-SETF-EXPANSION
HASH-TABLE-REHASH-SIZE HASH-TABLE-REHASH-THRESHOLD
INTERACTIVE-STREAM-P
LOAD-LOGICAL-PATHNAME-TRANSLATIONS LOGICAL-PATHNAME
LOGICAL-PATHNAME-TRANSLATIONS MAKE-LOAD-FORM
MAKE-LOAD-FORM-SAVING-SLOTS NO-NEXT-METHOD
OPEN-STREAM-P PATHNAME-MATCH-P PPRINT-DISPATCH
PPRINT-FILL PPRINT-INDENT PPRINT-LINEAR
PPRINT-NEWLINE PPRINT-TAB PPRINT-TABULAR
PRINT-NOT-READABLE-OBJECT READ-SEQUENCE
READTABLE-CASE SET-PPRINT-DISPATCH
SIMPLE-CONDITION-FORMAT-CONTROL
STREAM-EXTERNAL-FORMAT SYMBOL-MACROLET
SYNONYM-STREAM-SYMBOL TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TWO-WAY-STREAM-INPUT-STREAM
TWO-WAY-STREAM-OUTPUT-STREAM UNBOUND-SLOT-INSTANCE
UPGRADED-COMPLEX-PART-TYPE WILD-PATHNAME-P
WRITE-SEQUENCE
CLISP - ECL = LOAD-TIME-VALUE THE
|SBCL| = 661
SBCL - CLISP = LOCALLY
SBCL - GCL = ARITHMETIC-ERROR-OPERANDS BROADCAST-STREAM-STREAMS
CELL-ERROR-NAME COMPILER-MACRO-FUNCTION
CONCATENATED-STREAM-STREAMS COPY-PPRINT-DISPATCH
DESCRIBE-OBJECT ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ENSURE-DIRECTORIES-EXIST
FDEFINITION FILE-STRING-LENGTH FIND-METHOD
FUNCTION-LAMBDA-EXPRESSION GET-SETF-EXPANSION
HASH-TABLE-REHASH-SIZE HASH-TABLE-REHASH-THRESHOLD
INTERACTIVE-STREAM-P
LOAD-LOGICAL-PATHNAME-TRANSLATIONS LOCALLY
LOGICAL-PATHNAME LOGICAL-PATHNAME-TRANSLATIONS
MAKE-LOAD-FORM MAKE-LOAD-FORM-SAVING-SLOTS
NO-NEXT-METHOD OPEN-STREAM-P PATHNAME-MATCH-P
PPRINT-DISPATCH PPRINT-FILL PPRINT-INDENT
PPRINT-LINEAR PPRINT-NEWLINE PPRINT-TAB
PPRINT-TABULAR PRINT-NOT-READABLE-OBJECT
READ-SEQUENCE READTABLE-CASE SET-PPRINT-DISPATCH
SIMPLE-CONDITION-FORMAT-CONTROL
STREAM-EXTERNAL-FORMAT SYMBOL-MACROLET
SYNONYM-STREAM-SYMBOL TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TWO-WAY-STREAM-INPUT-STREAM
TWO-WAY-STREAM-OUTPUT-STREAM UNBOUND-SLOT-INSTANCE
UPGRADED-COMPLEX-PART-TYPE WILD-PATHNAME-P
WRITE-SEQUENCE
SBCL - ECL = LOAD-TIME-VALUE THE
|CMUCL| = 661
CMUCL - CLISP = LOCALLY
CMUCL - GCL = ARITHMETIC-ERROR-OPERANDS BROADCAST-STREAM-STREAMS
CELL-ERROR-NAME COMPILER-MACRO-FUNCTION
CONCATENATED-STREAM-STREAMS COPY-PPRINT-DISPATCH
DESCRIBE-OBJECT ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ENSURE-DIRECTORIES-EXIST
FDEFINITION FILE-STRING-LENGTH FIND-METHOD
FUNCTION-LAMBDA-EXPRESSION GET-SETF-EXPANSION
HASH-TABLE-REHASH-SIZE HASH-TABLE-REHASH-THRESHOLD
INTERACTIVE-STREAM-P
LOAD-LOGICAL-PATHNAME-TRANSLATIONS LOCALLY
LOGICAL-PATHNAME LOGICAL-PATHNAME-TRANSLATIONS
MAKE-LOAD-FORM MAKE-LOAD-FORM-SAVING-SLOTS
NO-NEXT-METHOD OPEN-STREAM-P PATHNAME-MATCH-P
PPRINT-DISPATCH PPRINT-FILL PPRINT-INDENT
PPRINT-LINEAR PPRINT-NEWLINE PPRINT-TAB
PPRINT-TABULAR PRINT-NOT-READABLE-OBJECT
READ-SEQUENCE READTABLE-CASE SET-PPRINT-DISPATCH
SIMPLE-CONDITION-FORMAT-CONTROL
STREAM-EXTERNAL-FORMAT SYMBOL-MACROLET
SYNONYM-STREAM-SYMBOL TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TWO-WAY-STREAM-INPUT-STREAM
TWO-WAY-STREAM-OUTPUT-STREAM UNBOUND-SLOT-INSTANCE
UPGRADED-COMPLEX-PART-TYPE WILD-PATHNAME-P
WRITE-SEQUENCE
CMUCL - ECL = LOAD-TIME-VALUE THE
|GCL| = 695
GCL - CLISP = ACCESSOR-METHOD-SLOT-DEFINITION ADD-DEPENDENT
ADD-DIRECT-METHOD ADD-DIRECT-SUBCLASS APPLYHOOK
CHAR-BIT CHAR-BITS CHAR-FONT CLASS-DEFAULT-INITARGS
CLASS-DIRECT-DEFAULT-INITARGS CLASS-DIRECT-SLOTS
CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-SUPERCLASSES
CLASS-FINALIZED-P CLASS-PRECEDENCE-LIST
CLASS-PROTOTYPE CLASS-SLOTS COMMONP COMPILER-LET
COMPUTE-APPLICABLE-METHODS-USING-CLASSES
COMPUTE-CLASS-PRECEDENCE-LIST
COMPUTE-DISCRIMINATING-FUNCTION
COMPUTE-EFFECTIVE-METHOD
COMPUTE-EFFECTIVE-SLOT-DEFINITION COMPUTE-SLOTS
DECLARE DIRECT-SLOT-DEFINITION-CLASS
EFFECTIVE-SLOT-DEFINITION-CLASS ENSURE-CLASS
ENSURE-CLASS-USING-CLASS
ENSURE-GENERIC-FUNCTION-USING-CLASS EVALHOOK
EXTRACT-LAMBDA-LIST EXTRACT-SPECIALIZER-NAMES
FINALIZE-INHERITANCE FIND-METHOD-COMBINATION
FUNCALLABLE-STANDARD-INSTANCE-ACCESS
GENERIC-FUNCTION-LAMBDA-LIST
GENERIC-FUNCTION-METHOD-CLASS
GENERIC-FUNCTION-METHOD-COMBINATION
GENERIC-FUNCTION-METHODS GENERIC-FUNCTION-NAME
GET-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE
IN-PACKAGE INT-CHAR INTERN-EQL-SPECIALIZER MAKE-CHAR
MAKE-METHOD-LAMBDA MAP-DEPENDENTS METHOD-FUNCTION
METHOD-GENERIC-FUNCTION METHOD-LAMBDA-LIST
METHOD-SPECIALIZERS READER-METHOD-CLASS
REMOVE-DEPENDENT REMOVE-DIRECT-METHOD
REMOVE-DIRECT-SUBCLASS RESET-SYS-PATHS SET-CHAR-BIT
SET-FUNCALLABLE-INSTANCE-FUNCTION
SIMPLE-CONDITION-FORMAT-STRING
SLOT-BOUNDP-USING-CLASS SLOT-DEFINITION-ALLOCATION
SLOT-DEFINITION-INITARGS SLOT-DEFINITION-INITFORM
SLOT-DEFINITION-INITFUNCTION SLOT-DEFINITION-LOCATION
SLOT-DEFINITION-NAME SLOT-DEFINITION-READERS
SLOT-DEFINITION-TYPE SLOT-DEFINITION-WRITERS
SLOT-MAKUNBOUND-USING-CLASS SLOT-VALUE-USING-CLASS
SPECIAL-FORM-P SPECIALIZER-DIRECT-METHODS
SPECIFIC-CORRECTABLE-ERROR SPECIFIC-ERROR
STANDARD-INSTANCE-ACCESS STRING-CHAR-P TYPE-ERROR
UPDATE-DEPENDENT VALIDATE-SUPERCLASS
WRITER-METHOD-CLASS
GCL - SBCL = ACCESSOR-METHOD-SLOT-DEFINITION ADD-DEPENDENT
ADD-DIRECT-METHOD ADD-DIRECT-SUBCLASS APPLYHOOK
CHAR-BIT CHAR-BITS CHAR-FONT CLASS-DEFAULT-INITARGS
CLASS-DIRECT-DEFAULT-INITARGS CLASS-DIRECT-SLOTS
CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-SUPERCLASSES
CLASS-FINALIZED-P CLASS-PRECEDENCE-LIST
CLASS-PROTOTYPE CLASS-SLOTS COMMONP COMPILER-LET
COMPUTE-APPLICABLE-METHODS-USING-CLASSES
COMPUTE-CLASS-PRECEDENCE-LIST
COMPUTE-DISCRIMINATING-FUNCTION
COMPUTE-EFFECTIVE-METHOD
COMPUTE-EFFECTIVE-SLOT-DEFINITION COMPUTE-SLOTS
DECLARE DIRECT-SLOT-DEFINITION-CLASS
EFFECTIVE-SLOT-DEFINITION-CLASS ENSURE-CLASS
ENSURE-CLASS-USING-CLASS
ENSURE-GENERIC-FUNCTION-USING-CLASS EVALHOOK
EXTRACT-LAMBDA-LIST EXTRACT-SPECIALIZER-NAMES
FINALIZE-INHERITANCE FIND-METHOD-COMBINATION
FUNCALLABLE-STANDARD-INSTANCE-ACCESS
GENERIC-FUNCTION-LAMBDA-LIST
GENERIC-FUNCTION-METHOD-CLASS
GENERIC-FUNCTION-METHOD-COMBINATION
GENERIC-FUNCTION-METHODS GENERIC-FUNCTION-NAME
GET-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE
IN-PACKAGE INT-CHAR INTERN-EQL-SPECIALIZER MAKE-CHAR
MAKE-METHOD-LAMBDA MAP-DEPENDENTS METHOD-FUNCTION
METHOD-GENERIC-FUNCTION METHOD-LAMBDA-LIST
METHOD-SPECIALIZERS READER-METHOD-CLASS
REMOVE-DEPENDENT REMOVE-DIRECT-METHOD
REMOVE-DIRECT-SUBCLASS RESET-SYS-PATHS SET-CHAR-BIT
SET-FUNCALLABLE-INSTANCE-FUNCTION
SIMPLE-CONDITION-FORMAT-STRING
SLOT-BOUNDP-USING-CLASS SLOT-DEFINITION-ALLOCATION
SLOT-DEFINITION-INITARGS SLOT-DEFINITION-INITFORM
SLOT-DEFINITION-INITFUNCTION SLOT-DEFINITION-LOCATION
SLOT-DEFINITION-NAME SLOT-DEFINITION-READERS
SLOT-DEFINITION-TYPE SLOT-DEFINITION-WRITERS
SLOT-MAKUNBOUND-USING-CLASS SLOT-VALUE-USING-CLASS
SPECIAL-FORM-P SPECIALIZER-DIRECT-METHODS
SPECIFIC-CORRECTABLE-ERROR SPECIFIC-ERROR
STANDARD-INSTANCE-ACCESS STRING-CHAR-P TYPE-ERROR
UPDATE-DEPENDENT VALIDATE-SUPERCLASS
WRITER-METHOD-CLASS
GCL - CMUCL = ACCESSOR-METHOD-SLOT-DEFINITION ADD-DEPENDENT
ADD-DIRECT-METHOD ADD-DIRECT-SUBCLASS APPLYHOOK
CHAR-BIT CHAR-BITS CHAR-FONT CLASS-DEFAULT-INITARGS
CLASS-DIRECT-DEFAULT-INITARGS CLASS-DIRECT-SLOTS
CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-SUPERCLASSES
CLASS-FINALIZED-P CLASS-PRECEDENCE-LIST
CLASS-PROTOTYPE CLASS-SLOTS COMMONP COMPILER-LET
COMPUTE-APPLICABLE-METHODS-USING-CLASSES
COMPUTE-CLASS-PRECEDENCE-LIST
COMPUTE-DISCRIMINATING-FUNCTION
COMPUTE-EFFECTIVE-METHOD
COMPUTE-EFFECTIVE-SLOT-DEFINITION COMPUTE-SLOTS
DECLARE DIRECT-SLOT-DEFINITION-CLASS
EFFECTIVE-SLOT-DEFINITION-CLASS ENSURE-CLASS
ENSURE-CLASS-USING-CLASS
ENSURE-GENERIC-FUNCTION-USING-CLASS EVALHOOK
EXTRACT-LAMBDA-LIST EXTRACT-SPECIALIZER-NAMES
FINALIZE-INHERITANCE FIND-METHOD-COMBINATION
FUNCALLABLE-STANDARD-INSTANCE-ACCESS
GENERIC-FUNCTION-LAMBDA-LIST
GENERIC-FUNCTION-METHOD-CLASS
GENERIC-FUNCTION-METHOD-COMBINATION
GENERIC-FUNCTION-METHODS GENERIC-FUNCTION-NAME
GET-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE
IN-PACKAGE INT-CHAR INTERN-EQL-SPECIALIZER MAKE-CHAR
MAKE-METHOD-LAMBDA MAP-DEPENDENTS METHOD-FUNCTION
METHOD-GENERIC-FUNCTION METHOD-LAMBDA-LIST
METHOD-SPECIALIZERS READER-METHOD-CLASS
REMOVE-DEPENDENT REMOVE-DIRECT-METHOD
REMOVE-DIRECT-SUBCLASS RESET-SYS-PATHS SET-CHAR-BIT
SET-FUNCALLABLE-INSTANCE-FUNCTION
SIMPLE-CONDITION-FORMAT-STRING
SLOT-BOUNDP-USING-CLASS SLOT-DEFINITION-ALLOCATION
SLOT-DEFINITION-INITARGS SLOT-DEFINITION-INITFORM
SLOT-DEFINITION-INITFUNCTION SLOT-DEFINITION-LOCATION
SLOT-DEFINITION-NAME SLOT-DEFINITION-READERS
SLOT-DEFINITION-TYPE SLOT-DEFINITION-WRITERS
SLOT-MAKUNBOUND-USING-CLASS SLOT-VALUE-USING-CLASS
SPECIAL-FORM-P SPECIALIZER-DIRECT-METHODS
SPECIFIC-CORRECTABLE-ERROR SPECIFIC-ERROR
STANDARD-INSTANCE-ACCESS STRING-CHAR-P TYPE-ERROR
UPDATE-DEPENDENT VALIDATE-SUPERCLASS
WRITER-METHOD-CLASS
GCL - ECL = ACCESSOR-METHOD-SLOT-DEFINITION ADD-DEPENDENT
ADD-DIRECT-METHOD ADD-DIRECT-SUBCLASS APPLYHOOK
CHAR-BIT CHAR-BITS CHAR-FONT CLASS-DEFAULT-INITARGS
CLASS-DIRECT-DEFAULT-INITARGS CLASS-DIRECT-SLOTS
CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-SUPERCLASSES
CLASS-FINALIZED-P CLASS-PRECEDENCE-LIST
CLASS-PROTOTYPE CLASS-SLOTS COMMONP COMPILER-LET
COMPUTE-APPLICABLE-METHODS-USING-CLASSES
COMPUTE-CLASS-PRECEDENCE-LIST
COMPUTE-DISCRIMINATING-FUNCTION
COMPUTE-EFFECTIVE-METHOD
COMPUTE-EFFECTIVE-SLOT-DEFINITION COMPUTE-SLOTS
DECLARE DIRECT-SLOT-DEFINITION-CLASS
EFFECTIVE-SLOT-DEFINITION-CLASS ENSURE-CLASS
ENSURE-CLASS-USING-CLASS
ENSURE-GENERIC-FUNCTION-USING-CLASS EVALHOOK
EXTRACT-LAMBDA-LIST EXTRACT-SPECIALIZER-NAMES
FINALIZE-INHERITANCE FIND-METHOD-COMBINATION
FUNCALLABLE-STANDARD-INSTANCE-ACCESS
GENERIC-FUNCTION-LAMBDA-LIST
GENERIC-FUNCTION-METHOD-CLASS
GENERIC-FUNCTION-METHOD-COMBINATION
GENERIC-FUNCTION-METHODS GENERIC-FUNCTION-NAME
GET-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE
IN-PACKAGE INT-CHAR INTERN-EQL-SPECIALIZER
LOAD-TIME-VALUE MAKE-CHAR MAKE-METHOD-LAMBDA
MAP-DEPENDENTS METHOD-FUNCTION
METHOD-GENERIC-FUNCTION METHOD-LAMBDA-LIST
METHOD-SPECIALIZERS READER-METHOD-CLASS
REMOVE-DEPENDENT REMOVE-DIRECT-METHOD
REMOVE-DIRECT-SUBCLASS RESET-SYS-PATHS SET-CHAR-BIT
SET-FUNCALLABLE-INSTANCE-FUNCTION
SIMPLE-CONDITION-FORMAT-STRING
SLOT-BOUNDP-USING-CLASS SLOT-DEFINITION-ALLOCATION
SLOT-DEFINITION-INITARGS SLOT-DEFINITION-INITFORM
SLOT-DEFINITION-INITFUNCTION SLOT-DEFINITION-LOCATION
SLOT-DEFINITION-NAME SLOT-DEFINITION-READERS
SLOT-DEFINITION-TYPE SLOT-DEFINITION-WRITERS
SLOT-MAKUNBOUND-USING-CLASS SLOT-VALUE-USING-CLASS
SPECIAL-FORM-P SPECIALIZER-DIRECT-METHODS
SPECIFIC-CORRECTABLE-ERROR SPECIFIC-ERROR
STANDARD-INSTANCE-ACCESS STRING-CHAR-P THE TYPE-ERROR
UPDATE-DEPENDENT VALIDATE-SUPERCLASS
WRITER-METHOD-CLASS
GCL - ACL = ACCESSOR-METHOD-SLOT-DEFINITION ADD-DEPENDENT
ADD-DIRECT-METHOD ADD-DIRECT-SUBCLASS APPLYHOOK
CHAR-BIT CHAR-BITS CHAR-FONT CLASS-DEFAULT-INITARGS
CLASS-DIRECT-DEFAULT-INITARGS CLASS-DIRECT-SLOTS
CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-SUPERCLASSES
CLASS-FINALIZED-P CLASS-PRECEDENCE-LIST
CLASS-PROTOTYPE CLASS-SLOTS COMMONP COMPILER-LET
COMPUTE-APPLICABLE-METHODS-USING-CLASSES
COMPUTE-CLASS-PRECEDENCE-LIST
COMPUTE-DISCRIMINATING-FUNCTION
COMPUTE-EFFECTIVE-METHOD
COMPUTE-EFFECTIVE-SLOT-DEFINITION COMPUTE-SLOTS
DECLARE DIRECT-SLOT-DEFINITION-CLASS
EFFECTIVE-SLOT-DEFINITION-CLASS ENSURE-CLASS
ENSURE-CLASS-USING-CLASS
ENSURE-GENERIC-FUNCTION-USING-CLASS EVALHOOK
EXTRACT-LAMBDA-LIST EXTRACT-SPECIALIZER-NAMES
FINALIZE-INHERITANCE FIND-METHOD-COMBINATION
FUNCALLABLE-STANDARD-INSTANCE-ACCESS
GENERIC-FUNCTION-LAMBDA-LIST
GENERIC-FUNCTION-METHOD-CLASS
GENERIC-FUNCTION-METHOD-COMBINATION
GENERIC-FUNCTION-METHODS GENERIC-FUNCTION-NAME
GET-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE
IN-PACKAGE INT-CHAR INTERN-EQL-SPECIALIZER MAKE-CHAR
MAKE-METHOD-LAMBDA MAP-DEPENDENTS METHOD-FUNCTION
METHOD-GENERIC-FUNCTION METHOD-LAMBDA-LIST
METHOD-SPECIALIZERS READER-METHOD-CLASS
REMOVE-DEPENDENT REMOVE-DIRECT-METHOD
REMOVE-DIRECT-SUBCLASS RESET-SYS-PATHS SET-CHAR-BIT
SET-FUNCALLABLE-INSTANCE-FUNCTION
SIMPLE-CONDITION-FORMAT-STRING
SLOT-BOUNDP-USING-CLASS SLOT-DEFINITION-ALLOCATION
SLOT-DEFINITION-INITARGS SLOT-DEFINITION-INITFORM
SLOT-DEFINITION-INITFUNCTION SLOT-DEFINITION-LOCATION
SLOT-DEFINITION-NAME SLOT-DEFINITION-READERS
SLOT-DEFINITION-TYPE SLOT-DEFINITION-WRITERS
SLOT-MAKUNBOUND-USING-CLASS SLOT-VALUE-USING-CLASS
SPECIAL-FORM-P SPECIALIZER-DIRECT-METHODS
SPECIFIC-CORRECTABLE-ERROR SPECIFIC-ERROR
STANDARD-INSTANCE-ACCESS STRING-CHAR-P TYPE-ERROR
UPDATE-DEPENDENT VALIDATE-SUPERCLASS
WRITER-METHOD-CLASS
|ECL| = 660
ECL - CLISP = LOCALLY MAKE-METHOD
ECL - SBCL = MAKE-METHOD
ECL - CMUCL = MAKE-METHOD
ECL - GCL = ARITHMETIC-ERROR-OPERANDS BROADCAST-STREAM-STREAMS
CELL-ERROR-NAME COMPILER-MACRO-FUNCTION
CONCATENATED-STREAM-STREAMS COPY-PPRINT-DISPATCH
DESCRIBE-OBJECT ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ENSURE-DIRECTORIES-EXIST
FDEFINITION FILE-STRING-LENGTH FIND-METHOD
FUNCTION-LAMBDA-EXPRESSION GET-SETF-EXPANSION
HASH-TABLE-REHASH-SIZE HASH-TABLE-REHASH-THRESHOLD
INTERACTIVE-STREAM-P
LOAD-LOGICAL-PATHNAME-TRANSLATIONS LOCALLY
LOGICAL-PATHNAME LOGICAL-PATHNAME-TRANSLATIONS
MAKE-LOAD-FORM MAKE-LOAD-FORM-SAVING-SLOTS
MAKE-METHOD NO-NEXT-METHOD OPEN-STREAM-P
PATHNAME-MATCH-P PPRINT-DISPATCH PPRINT-FILL
PPRINT-INDENT PPRINT-LINEAR PPRINT-NEWLINE PPRINT-TAB
PPRINT-TABULAR PRINT-NOT-READABLE-OBJECT
READ-SEQUENCE READTABLE-CASE SET-PPRINT-DISPATCH
SIMPLE-CONDITION-FORMAT-CONTROL
STREAM-EXTERNAL-FORMAT SYMBOL-MACROLET
SYNONYM-STREAM-SYMBOL TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TWO-WAY-STREAM-INPUT-STREAM
TWO-WAY-STREAM-OUTPUT-STREAM UNBOUND-SLOT-INSTANCE
UPGRADED-COMPLEX-PART-TYPE WILD-PATHNAME-P
WRITE-SEQUENCE
ECL - ACL = MAKE-METHOD
|ACL| = 661
ACL - CLISP = LOCALLY
ACL - GCL = ARITHMETIC-ERROR-OPERANDS BROADCAST-STREAM-STREAMS
CELL-ERROR-NAME COMPILER-MACRO-FUNCTION
CONCATENATED-STREAM-STREAMS COPY-PPRINT-DISPATCH
DESCRIBE-OBJECT ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ENSURE-DIRECTORIES-EXIST
FDEFINITION FILE-STRING-LENGTH FIND-METHOD
FUNCTION-LAMBDA-EXPRESSION GET-SETF-EXPANSION
HASH-TABLE-REHASH-SIZE HASH-TABLE-REHASH-THRESHOLD
INTERACTIVE-STREAM-P
LOAD-LOGICAL-PATHNAME-TRANSLATIONS LOCALLY
LOGICAL-PATHNAME LOGICAL-PATHNAME-TRANSLATIONS
MAKE-LOAD-FORM MAKE-LOAD-FORM-SAVING-SLOTS
NO-NEXT-METHOD OPEN-STREAM-P PATHNAME-MATCH-P
PPRINT-DISPATCH PPRINT-FILL PPRINT-INDENT
PPRINT-LINEAR PPRINT-NEWLINE PPRINT-TAB
PPRINT-TABULAR PRINT-NOT-READABLE-OBJECT
READ-SEQUENCE READTABLE-CASE SET-PPRINT-DISPATCH
SIMPLE-CONDITION-FORMAT-CONTROL
STREAM-EXTERNAL-FORMAT SYMBOL-MACROLET
SYNONYM-STREAM-SYMBOL TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TWO-WAY-STREAM-INPUT-STREAM
TWO-WAY-STREAM-OUTPUT-STREAM UNBOUND-SLOT-INSTANCE
UPGRADED-COMPLEX-PART-TYPE WILD-PATHNAME-P
WRITE-SEQUENCE
ACL - ECL = LOAD-TIME-VALUE THE
--
__Pascal Bourguignon__ http://www.informatimago.com/
"You can tell the Lisp programmers. They have pockets full of punch
cards with close parentheses on them." --> http://tinyurl.com/8ubpf
Must...resist...the...urge... to generate the Venn diagram... ;-)
--g
> here's a piecewise
> one
The same, all at one hackish go thanks to relentless use of loop keywords ;^)
(defun doc-pkg-fns (pkg)
(loop with home-package = (find-package pkg)
for sym being each symbol of home-package
when (handler-case (symbol-function sym) (undefined-function () nil))
when (eq (symbol-package sym) home-package)
do (format t "~a~%~a~%~%" sym
(or (documentation sym 'function) ""))))
> The same, all at one hackish go thanks to relentless use of loop keywords ;^)
Or with fboundp - duh!
(defun doc-pkg-fns (pkg)
(loop with home-package = (find-package pkg)
for sym being each symbol of home-package
when (fboundp sym)
(defun package-symbols (package &key (external t) (internal t)
(inherited nil))
(mapcar #'car (package-symbol-access-pairs package
:external external
:internal internal
:inherited inherited)))
(defun package-symbol-access-pairs (package &key (external t) (internal
t) (inherited nil))
(remove-if-not (lambda (symbol-access-pair)
(let ((accessibility (cdr symbol-access-pair)))
(or (and external (eq accessibility :external))
(and internal (eq accessibility :internal))
(and inherited (eq accessibility :inherited)))))
(all-package-symbol-access-pairs package)))
(defun all-package-symbol-access-pairs (package)
(let ((all-symbols))
(do-symbols (x package)
(multiple-value-bind (symbol accessibility)
(find-symbol (symbol-name x) package)
(push (cons symbol accessibility) all-symbols)))
all-symbols))
- Jake
Erm, no it doesn't use tail recursion. It does use a functional style
of programming. MAPCAR and REMOVE-IF-NOT are both higher-order
functions --- functions that take other functions as arguments --- and
are usual suspects in a functional program. I think this is what you
mean. Tail recursion is something else entirely, and it's not present
in your code.
Whether you use LOOP or a functional approach is a matter of personal
taste, and I doubt that you would be considered "weird" in any Lisp
circles for preferring the latter. Stand tall and be functional! ;-)
--g