mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-19 03:00:25 +02:00
merge in from guile-lib: add some extensibility to `help'
* ice-9/session.scm (add-value-help-handler!) (remove-value-help-handler!, add-name-help-handler!) (remove-name-help-handler!): New public interfaces, to allow some basic extensibility of the help interface. Merged in from guile-lib's (scheme session).
This commit is contained in:
parent
ab878b0f8e
commit
4f7a0504aa
1 changed files with 64 additions and 8 deletions
|
@ -20,12 +20,61 @@
|
||||||
:use-module (ice-9 documentation)
|
:use-module (ice-9 documentation)
|
||||||
:use-module (ice-9 regex)
|
:use-module (ice-9 regex)
|
||||||
:use-module (ice-9 rdelim)
|
:use-module (ice-9 rdelim)
|
||||||
:export (help apropos apropos-internal apropos-fold
|
:export (help
|
||||||
apropos-fold-accessible apropos-fold-exported apropos-fold-all
|
add-value-help-handler! remove-value-help-handler!
|
||||||
source arity system-module))
|
add-name-help-handler! remove-name-help-handler!
|
||||||
|
apropos apropos-internal apropos-fold apropos-fold-accessible
|
||||||
|
apropos-fold-exported apropos-fold-all source arity
|
||||||
|
system-module module-commentary))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(define *value-help-handlers* '())
|
||||||
|
|
||||||
|
(define (add-value-help-handler! proc)
|
||||||
|
"Adds a handler for performing `help' on a value.
|
||||||
|
|
||||||
|
`proc' will be called as (PROC NAME VALUE). `proc' should return #t to
|
||||||
|
indicate that it has performed help, a string to override the default
|
||||||
|
object documentation, or #f to try the other handlers, potentially
|
||||||
|
falling back on the normal behavior for `help'."
|
||||||
|
(set! *value-help-handlers* (cons proc *value-help-handlers*)))
|
||||||
|
|
||||||
|
(define (remove-value-help-handler! proc)
|
||||||
|
"Removes a handler for performing `help' on a value.
|
||||||
|
|
||||||
|
See the documentation for `add-value-help-handler' for more
|
||||||
|
information."
|
||||||
|
(set! *value-help-handlers* (delete! proc *value-help-handlers*)))
|
||||||
|
|
||||||
|
(define (try-value-help name value)
|
||||||
|
(or-map (lambda (proc) (proc name value)) *value-help-handlers*))
|
||||||
|
|
||||||
|
|
||||||
|
(define *name-help-handlers* '())
|
||||||
|
|
||||||
|
(define (add-name-help-handler! proc)
|
||||||
|
"Adds a handler for performing `help' on a name.
|
||||||
|
|
||||||
|
`proc' will be called with the unevaluated name as its argument. That is
|
||||||
|
to say, when the user calls `(help FOO)', the name is FOO, exactly as
|
||||||
|
the user types it.
|
||||||
|
|
||||||
|
The return value of `proc' is as specified in
|
||||||
|
`add-value-help-handler!'."
|
||||||
|
(set! *name-help-handlers* (cons proc *name-help-handlers*)))
|
||||||
|
|
||||||
|
(define (remove-name-help-handler! proc)
|
||||||
|
"Removes a handler for performing `help' on a name.
|
||||||
|
|
||||||
|
See the documentation for `add-name-help-handler' for more
|
||||||
|
information."
|
||||||
|
(set! *name-help-handlers* (delete! proc *name-help-handlers*)))
|
||||||
|
|
||||||
|
(define (try-name-help name)
|
||||||
|
(or-map (lambda (proc) (proc name)) *name-help-handlers*))
|
||||||
|
|
||||||
|
|
||||||
;;; Documentation
|
;;; Documentation
|
||||||
;;;
|
;;;
|
||||||
(define help
|
(define help
|
||||||
|
@ -45,6 +94,10 @@ You don't seem to have regular expressions installed.\n"))
|
||||||
type x))))
|
type x))))
|
||||||
(cond
|
(cond
|
||||||
|
|
||||||
|
;; User-specified
|
||||||
|
((try-name-help name)
|
||||||
|
=> (lambda (x) (if (not (eq? x #t)) (display x))))
|
||||||
|
|
||||||
;; SYMBOL
|
;; SYMBOL
|
||||||
((symbol? name)
|
((symbol? name)
|
||||||
(help-doc name
|
(help-doc name
|
||||||
|
@ -60,10 +113,12 @@ You don't seem to have regular expressions installed.\n"))
|
||||||
((and (list? name)
|
((and (list? name)
|
||||||
(= (length name) 2)
|
(= (length name) 2)
|
||||||
(eq? (car name) 'unquote))
|
(eq? (car name) 'unquote))
|
||||||
(cond ((object-documentation
|
(let ((value (local-eval (cadr name) env)))
|
||||||
(local-eval (cadr name) env))
|
(cond ((try-value-help (cadr name) value)
|
||||||
=> write-line)
|
=> noop)
|
||||||
(else (not-found 'documentation (cadr name)))))
|
((object-documentation value)
|
||||||
|
=> write-line)
|
||||||
|
(else (not-found 'documentation (cadr name))))))
|
||||||
|
|
||||||
;; (quote SYMBOL)
|
;; (quote SYMBOL)
|
||||||
((and (list? name)
|
((and (list? name)
|
||||||
|
@ -109,7 +164,8 @@ You don't seem to have regular expressions installed.\n"))
|
||||||
(let ((entries (apropos-fold (lambda (module name object data)
|
(let ((entries (apropos-fold (lambda (module name object data)
|
||||||
(cons (list module
|
(cons (list module
|
||||||
name
|
name
|
||||||
(object-documentation object)
|
(or (try-value-help name object)
|
||||||
|
(object-documentation object))
|
||||||
(cond ((closure? object)
|
(cond ((closure? object)
|
||||||
"a procedure")
|
"a procedure")
|
||||||
((procedure? object)
|
((procedure? object)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue