2000-06-11 18:30:56 +00:00
|
|
|
|
;;;; Copyright (C) 2000 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, Inc., 59 Temple Place, Suite 330,
|
|
|
|
|
|
;;;; Boston, MA 02111-1307 USA
|
|
|
|
|
|
;;;;
|
|
|
|
|
|
|
|
|
|
|
|
(define-module (ice-9 documentation)
|
|
|
|
|
|
:no-backtrace)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
|
;; documentation-files is the list of places to look for documentation
|
|
|
|
|
|
;;
|
|
|
|
|
|
(define-public documentation-files
|
|
|
|
|
|
(map (lambda (vicinity)
|
|
|
|
|
|
(in-vicinity (vicinity) "guile-procedures.txt"))
|
|
|
|
|
|
(list %library-dir
|
|
|
|
|
|
%package-data-dir
|
|
|
|
|
|
%site-dir
|
|
|
|
|
|
(lambda () "."))))
|
|
|
|
|
|
|
|
|
|
|
|
(define (find-documentation name)
|
|
|
|
|
|
(or-map (lambda (file)
|
|
|
|
|
|
(find-documentation-in-file name file))
|
|
|
|
|
|
documentation-files))
|
|
|
|
|
|
|
|
|
|
|
|
(define entry-delimiter "\f")
|
|
|
|
|
|
|
|
|
|
|
|
(define (find-documentation-in-file name file)
|
|
|
|
|
|
(and (file-exists? file)
|
|
|
|
|
|
(let ((port (open-input-file file))
|
|
|
|
|
|
(name (symbol->string name)))
|
2000-09-29 20:39:29 +00:00
|
|
|
|
(let ((len (string-length name)))
|
2000-06-11 18:30:56 +00:00
|
|
|
|
(read-delimited entry-delimiter port) ;skip to first entry
|
|
|
|
|
|
(let loop ((entry (read-delimited entry-delimiter port)))
|
|
|
|
|
|
(cond ((eof-object? entry) #f)
|
|
|
|
|
|
;; match?
|
|
|
|
|
|
((and ;; large enough?
|
2000-09-29 20:39:29 +00:00
|
|
|
|
(>= (string-length entry) len)
|
2000-06-11 18:30:56 +00:00
|
|
|
|
;; matching name?
|
2000-09-29 20:39:29 +00:00
|
|
|
|
(string=? (substring entry 0 len) name)
|
2000-06-11 18:30:56 +00:00
|
|
|
|
;; terminated?
|
2000-09-29 20:39:29 +00:00
|
|
|
|
(memq (string-ref entry len) '(#\newline)))
|
|
|
|
|
|
;; cut away name tag and extra surrounding newlines
|
|
|
|
|
|
(substring entry (+ len 2) (- (string-length entry) 2)))
|
2000-06-11 18:30:56 +00:00
|
|
|
|
(else (loop (read-delimited entry-delimiter port)))))))))
|
|
|
|
|
|
|
|
|
|
|
|
;; helper until the procedure documentation property is cleaned up
|
|
|
|
|
|
(define (proc-doc proc)
|
|
|
|
|
|
(or (procedure-documentation proc)
|
|
|
|
|
|
(procedure-property proc 'documentation)))
|
|
|
|
|
|
|
|
|
|
|
|
(define-public (object-documentation object)
|
|
|
|
|
|
"Return the docstring for OBJECT."
|
|
|
|
|
|
(or (and (procedure? object)
|
|
|
|
|
|
(proc-doc object))
|
|
|
|
|
|
(and (macro? object)
|
|
|
|
|
|
(let ((transformer (macro-transformer object)))
|
|
|
|
|
|
(and transformer
|
|
|
|
|
|
(proc-doc transformer))))
|
|
|
|
|
|
(object-property object 'documentation)
|
|
|
|
|
|
;; find-documentation currently only works for builtin primitives
|
|
|
|
|
|
(and (procedure? object)
|
|
|
|
|
|
(not (closure? object))
|
|
|
|
|
|
(procedure-name object)
|
|
|
|
|
|
(let ((docstring (find-documentation (procedure-name object))))
|
|
|
|
|
|
(if docstring
|
|
|
|
|
|
(set-procedure-property! object 'documentation docstring))
|
|
|
|
|
|
docstring))))
|