mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-29 22:40:34 +02:00
Merge commit '53d81399be
' into vm-check
Also cherry-picks the changes from 1405f1b60fa178303484cd428068ecd01ff6d322 Conflicts: module/ice-9/session.scm
This commit is contained in:
commit
df22662f5d
1 changed files with 60 additions and 8 deletions
|
@ -20,12 +20,59 @@
|
||||||
: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 procedure-arguments))
|
add-name-help-handler! remove-name-help-handler!
|
||||||
|
apropos apropos-internal apropos-fold apropos-fold-accessible
|
||||||
|
apropos-fold-exported apropos-fold-all source arity
|
||||||
|
procedure-arguments
|
||||||
|
module-commentary))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(define *value-help-handlers*
|
||||||
|
`(,(lambda (name value)
|
||||||
|
(object-documentation value))))
|
||||||
|
|
||||||
|
(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."
|
||||||
|
(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.
|
||||||
|
|
||||||
|
`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! *name-help-handlers* (cons proc *name-help-handlers*)))
|
||||||
|
|
||||||
|
(define (remove-name-help-handler! proc)
|
||||||
|
"Removes a handler for performing `help' on a name."
|
||||||
|
(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-macro (help . exp)
|
(define-macro (help . exp)
|
||||||
|
@ -45,6 +92,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 +111,11 @@ 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 ((doc (try-value-help (cadr name)
|
||||||
(eval (cadr name) (current-module)))
|
(local-eval (cadr name) env))))
|
||||||
=> write-line)
|
(cond ((not doc) (not-found 'documentation (cadr name)))
|
||||||
(else (not-found 'documentation (cadr name)))))
|
((eq? doc #t)) ;; pass
|
||||||
|
(else (write-line doc)))))
|
||||||
|
|
||||||
;; (quote SYMBOL)
|
;; (quote SYMBOL)
|
||||||
((and (list? name)
|
((and (list? name)
|
||||||
|
@ -109,7 +161,7 @@ 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)
|
(try-value-help name 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