1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 21:10:27 +02:00
guile/ice-9/documentation.scm
2000-06-11 18:30:56 +00:00

86 lines
2.9 KiB
Scheme
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;;; 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 entry-start 2)
(define (find-documentation-in-file name file)
(and (file-exists? file)
(let ((port (open-input-file file))
(name (symbol->string name)))
(let* ((len (string-length name))
(min-size (+ entry-start len))
(end (+ entry-start len)))
(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?
(>= (string-length entry) min-size)
;; matching name?
(string=? (substring entry entry-start end)
name)
;; terminated?
(memq (string-ref entry end) '(#\space #\))))
;; cut away starting and ending newline
(substring entry 1 (- (string-length entry) 1)))
(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))))