0.9.5.58:
[sbcl.git] / src / pcl / early-low.lisp
1 ;;;; some code pulled out of CMU CL's low.lisp to solve build order problems,
2 ;;;; and some other stuff that just plain needs to be done early
3
4 ;;;; This software is part of the SBCL system. See the README file for
5 ;;;; more information.
6
7 ;;;; This software is derived from software originally released by Xerox
8 ;;;; Corporation. Copyright and release statements follow. Later modifications
9 ;;;; to the software are in the public domain and are provided with
10 ;;;; absolutely no warranty. See the COPYING and CREDITS files for more
11 ;;;; information.
12
13 ;;;; copyright information from original PCL sources:
14 ;;;;
15 ;;;; Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 Xerox Corporation.
16 ;;;; All rights reserved.
17 ;;;;
18 ;;;; Use and copying of this software and preparation of derivative works based
19 ;;;; upon this software are permitted. Any distribution of this software or
20 ;;;; derivative works must comply with all applicable United States export
21 ;;;; control laws.
22 ;;;;
23 ;;;; This software is made available AS IS, and Xerox Corporation makes no
24 ;;;; warranty about the software, its performance or its conformity to any
25 ;;;; specification.
26
27 (in-package "SB-PCL")
28
29 (/show "starting early-low.lisp")
30 \f
31 ;;; FIXME: The PCL package is internal and is used by code in potential
32 ;;; bottlenecks. Access to it might be faster through #.(find-package "SB-PCL")
33 ;;; than through *PCL-PACKAGE*. And since it's internal, no one should be
34 ;;; doing things like deleting and recreating it in a running target Lisp.
35 ;;; So perhaps we should replace it uses of *PCL-PACKAGE* with uses of
36 ;;; (PCL-PACKAGE), and make PCL-PACKAGE a macro which expands into
37 ;;; the SB-PCL package itself. Maybe we should even use this trick for
38 ;;; COMMON-LISP and KEYWORD, too. (And the definition of PCL-PACKAGE etc.
39 ;;; could be made less viciously brittle when SB-FLUID.)
40 ;;; (Or perhaps just define a macro
41 ;;;   (DEFMACRO PKG (NAME)
42 ;;;     #-SB-FLUID (FIND-PACKAGE NAME)
43 ;;;     #+SB-FLUID `(FIND-PACKAGE ,NAME))
44 ;;; and use that to replace all three variables.)
45 (defvar *pcl-package*                (find-package "SB-PCL"))
46
47 ;;; This excludes structure types created with the :TYPE option to
48 ;;; DEFSTRUCT. It also doesn't try to deal with types created by
49 ;;; hairy DEFTYPEs, e.g.
50 ;;;   (DEFTYPE CACHE-STRUCTURE (SIZE)
51 ;;;     (IF (> SIZE 11) 'BIG-CS 'SMALL-CS)).
52 ;;; KLUDGE: In fact, it doesn't seem to deal with DEFTYPEs at all. Perhaps
53 ;;; it needs a more mnemonic name. -- WHN 19991204
54 (defun structure-type-p (type)
55   (and (symbolp type)
56        (not (condition-type-p type))
57        (let ((classoid (find-classoid type nil)))
58          (and classoid
59               (typep (layout-info
60                       (classoid-layout classoid))
61                      'defstruct-description)))))
62
63 ;;; Symbol contruction utilities
64 (defun format-symbol (package format-string &rest format-arguments)
65   (without-package-locks
66    (intern (apply #'format nil format-string format-arguments) package)))
67
68 (defun make-class-symbol (class-name)
69   (format-symbol *pcl-package* "*THE-CLASS-~A*" (symbol-name class-name)))
70
71 (defun make-wrapper-symbol (class-name)
72   (format-symbol *pcl-package* "*THE-WRAPPER-~A*" (symbol-name class-name)))
73
74 (defun condition-type-p (type)
75   (and (symbolp type)
76        (condition-classoid-p (find-classoid type nil))))
77 \f
78 (declaim (special *the-class-t*
79                   *the-class-vector* *the-class-symbol*
80                   *the-class-string* *the-class-sequence*
81                   *the-class-rational* *the-class-ratio*
82                   *the-class-number* *the-class-null* *the-class-list*
83                   *the-class-integer* *the-class-float* *the-class-cons*
84                   *the-class-complex* *the-class-character*
85                   *the-class-bit-vector* *the-class-array*
86                   *the-class-stream* *the-class-file-stream*
87                   *the-class-string-stream*
88
89                   *the-class-slot-object*
90                   *the-class-structure-object*
91                   *the-class-standard-object*
92                   *the-class-funcallable-standard-object*
93                   *the-class-class*
94                   *the-class-generic-function*
95                   *the-class-built-in-class*
96                   *the-class-slot-class*
97                   *the-class-condition-class*
98                   *the-class-structure-class*
99                   *the-class-std-class*
100                   *the-class-standard-class*
101                   *the-class-funcallable-standard-class*
102                   *the-class-method*
103                   *the-class-standard-method*
104                   *the-class-standard-reader-method*
105                   *the-class-standard-writer-method*
106                   *the-class-standard-boundp-method*
107                   *the-class-standard-generic-function*
108                   *the-class-standard-effective-slot-definition*
109
110                   *the-eslotd-standard-class-slots*
111                   *the-eslotd-funcallable-standard-class-slots*))
112
113 (declaim (special *the-wrapper-of-t*
114                   *the-wrapper-of-vector* *the-wrapper-of-symbol*
115                   *the-wrapper-of-string* *the-wrapper-of-sequence*
116                   *the-wrapper-of-rational* *the-wrapper-of-ratio*
117                   *the-wrapper-of-number* *the-wrapper-of-null*
118                   *the-wrapper-of-list* *the-wrapper-of-integer*
119                   *the-wrapper-of-float* *the-wrapper-of-cons*
120                   *the-wrapper-of-complex* *the-wrapper-of-character*
121                   *the-wrapper-of-bit-vector* *the-wrapper-of-array*))
122 \f
123 (/show "finished with early-low.lisp")