changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/doc/package.lisp

changeset 262: 5673cd3f11e1
parent: a067da6d51c1
child: b7183bfd7107
author: Richard Westhaver <ellis@rwest.io>
date: Thu, 04 Apr 2024 21:43:20 -0400
permissions: -rw-r--r--
description: documentation system
137
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; lib/doc/package.lisp --- Package Documentation
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
3
 ;; Package documentation abstractions and machinery
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
4
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
5
 ;;; Commentary:
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
6
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
7
 ;; We usually think of packages as composed of one or more files, but
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
8
 ;; this is not always the case in Lisp. Packages can be defined in a
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
9
 ;; REPL with no underlying source files, or via macros, which can
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
10
 ;; obfuscate the origin of a form.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
11
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
12
 ;; The good news is that packages are 'real' objects that are exposed
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
13
 ;; to us after load-time. If we are willing to wait for the packages
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
14
 ;; to actually be loaded in a Lisp image before attempting to compile
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
15
 ;; 'package documentation' this makes everything incredibly easy with
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
16
 ;; SB-INTROSPECT and friends.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
17
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
18
 ;; All that remains is to provide an interface for linking the various
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
19
 ;; downstream *-DOCUMENTATION objects with a compiled
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
20
 ;; PACKAGE-DEFINITION object.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
21
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
22
 ;; The logical next step is linking PACKAGE-DOCUMENTATION objects with
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
23
 ;; other PACKAGE-DEFINITIONs.
137
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
24
 
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
25
 ;;; Code:
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
26
 (in-package :doc)
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
27
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
28
 (defclass package-documentation ()
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
29
   ((package :initform *package* :initarg :package :type package :accessor doc-package)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
30
    (files :initform #() :initarg :files :type (array file-documentation) :accessor doc-files)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
31
    (symbols :initform #() :initarg :symbols :type (array symbol-documentation) :accessor doc-symbols)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
32
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
33
 (defun package-documentation (&optional package (for :external))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
34
   "Return a PACKAGE-DOCUMENTATION object from PACKAGE."
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
35
   (unless (packagep package)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
36
     (if (or (null package) (eq t package))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
37
         (setf package *package*)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
38
         (setf package (find-package package))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
39
   (let ((paths)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
40
         (symbols (make-array (sb-c::package-external-symbol-count package)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
41
                              :element-type 'symbol-documentation
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
42
                              :fill-pointer 0)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
43
     ;; TODO: we always want external symbols, we need XOR
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
44
     (case for
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
45
       (:internal (do-symbols* (s package)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
46
                    (let ((doc (symbol-documentation s)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
47
                      (dolist (p (symbol-doc-files doc))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
48
                        (pushnew p paths))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
49
                      (vector-push-extend doc symbols 8))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
50
       (:external (do-external-symbols (s package)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
51
                    (let ((doc (symbol-documentation s)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
52
                      (dolist (p (symbol-doc-files doc))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
53
                        (pushnew p paths))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
54
                      (vector-push doc symbols))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
55
       (t (loop for s being each present-symbol in package
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
56
                do (let ((doc (symbol-documentation s)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
57
                     (dolist (p (symbol-doc-files doc))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
58
                       (unless (null p)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
59
                         (pushnew p paths)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
60
                     (vector-push doc symbols)))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
61
     (make-instance 'package-documentation
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
62
       :package package
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
63
       :files (map 'vector #'file-documentation paths)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
64
       :symbols symbols)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
65
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
66
 (defmethod print-object ((self package-documentation) stream)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
67
   (with-slots (package files symbols) self
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
68
     (print-unreadable-object (self stream :type t)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
69
       (format stream "~A :symbols ~A :files ~A" (package-name package) (length symbols) (length files)))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
70
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
71
 ;; (package-used-by-list (doc-package (package-documentation (find-package :std))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
72
 ;; (sb-introspect:allocation-information (make-instance 'package-documentation))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
73
 ;; sb-introspect:definition-source
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
74
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
75
 ;; (sb-introspect::object-size-histogram :static)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
76
 ;; (sb-introspect:find-definition-source (find-package :doc))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
77
 ;; (sb-introspect:find-definition-sources-by-name 'std-error :condition)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
78
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
79
 ;; (package-documentation)