diff --git a/src/reflection.scm b/src/reflection.scm index 32d844e..5d5cbbe 100644 --- a/src/reflection.scm +++ b/src/reflection.scm @@ -1,14 +1,27 @@ +(define-module (guile-docs reflection) + #:export (current-module-docs + pp-module-docs)) + +(define (current-module-docs) + "Print the docs for the current module as well as all of the modules used by this module." + (let* ((cur (current-module)) + (used (module-uses cur))) + (pp-module-docs cur) + (map pp-module-docs used) + #f)) -;; Example of how to fetch docs from a module. -;; This sort of pattern can be used when we want to scan a given module. (define (pp-module-docs module) + "Example of how to fetch docs from a module. +This sort of pattern can be used when we want to scan a given module. +Input is a module object, not a module name. For that, invoke (resolve-interface '(a module)) +before passing to this method." (module-for-each (lambda (sym var) (let* ((binding (variable-ref var)) (proc (cond ((procedure? binding) binding) ((macro? binding) (macro-binding binding)) - (else "???"))) - (docs (procedure-documentation proc))) - (format #t "-- ~y ~a\n" sym docs))) - (resolve-interface module))) + (else #f))) + (docs (when (procedure? proc) (procedure-documentation proc)))) + (format #t "-- ~y ~a\n" sym (or docs "")))) + module))