mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-05 06:50:21 +02:00
88 lines
2.5 KiB
Scheme
88 lines
2.5 KiB
Scheme
;;;; Copyright (C) 1997 Free Software Foundation, Inc.
|
||
;;;;
|
||
;;;; This program is free software; you can redistribute it and/or modify
|
||
;;;; it under the terms of the GNU General Public License as published by
|
||
;;;; the Free Software Foundation; either version 2, or (at your option)
|
||
;;;; any later version.
|
||
;;;;
|
||
;;;; This program is distributed in the hope that it will be useful,
|
||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
;;;; GNU General Public License for more details.
|
||
;;;;
|
||
;;;; You should have received a copy of the GNU General Public License
|
||
;;;; along with this software; see the file COPYING. If not, write to
|
||
;;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
;;;;
|
||
|
||
|
||
(define-module (ice-9 session))
|
||
|
||
|
||
|
||
;;; {Apropos}
|
||
;;;
|
||
;;; Author: Roland Orre <orre@nada.kth.se>
|
||
;;;
|
||
|
||
(define (id x) x)
|
||
|
||
(define (vector-for-each proc vector)
|
||
(do ((i (+ -1 (vector-length vector)) (+ -1 i)))
|
||
((negative? i))
|
||
(proc (vector-ref vector i))))
|
||
|
||
(define-public (apropos rgx . options)
|
||
"Search for bindings: apropos regexp {options= 'full 'shadow 'value}"
|
||
(if (zero? (string-length rgx))
|
||
"Empty string not allowed"
|
||
(let* ((match (make-regexp rgx))
|
||
(modules (cons (current-module)
|
||
(module-uses (current-module))))
|
||
(separator #\tab)
|
||
(shadow (member 'shadow options))
|
||
(value (member 'value options)))
|
||
(cond ((member 'full options)
|
||
(set! shadow #t)
|
||
(set! value #t)))
|
||
(for-each
|
||
(lambda (module)
|
||
(let* ((builtin (or (eq? module the-scm-module)
|
||
(eq? module the-root-module)))
|
||
(name (module-name module))
|
||
(obarrays (if builtin
|
||
(list (builtin-weak-bindings)
|
||
(builtin-bindings))
|
||
(list (module-obarray module))))
|
||
(get-refs (if builtin
|
||
(list id id)
|
||
(list variable-ref)))
|
||
)
|
||
(for-each
|
||
(lambda (obarray get-ref)
|
||
(vector-for-each
|
||
(lambda (oblist)
|
||
(for-each
|
||
(lambda (x)
|
||
(cond ((regexp-exec match (car x))
|
||
(display name)
|
||
(display ": ")
|
||
(display (car x))
|
||
(cond ((procedure? (get-ref (cdr x)))
|
||
(display separator)
|
||
(display (get-ref (cdr x))))
|
||
(value
|
||
(display separator)
|
||
(display (get-ref (cdr x)))))
|
||
(if (and shadow
|
||
(not (eq? (module-ref module
|
||
(car x))
|
||
(module-ref (current-module)
|
||
(car x)))))
|
||
(display " shadowed"))
|
||
(newline)
|
||
)))
|
||
oblist))
|
||
obarray))
|
||
obarrays get-refs)))
|
||
modules))))
|