source: trunk/j/src/org/armedbear/lisp/boot.lisp @ 8534

Last change on this file since 8534 was 8534, checked in by piso, 16 years ago

(load-system-file "fdefinition")

File size: 11.1 KB
Line 
1;;; boot.lisp
2;;;
3;;; Copyright (C) 2003-2005 Peter Graves
4;;; $Id: boot.lisp,v 1.205 2005-02-11 19:38:14 piso Exp $
5;;;
6;;; This program is free software; you can redistribute it and/or
7;;; modify it under the terms of the GNU General Public License
8;;; as published by the Free Software Foundation; either version 2
9;;; of the License, or (at your option) any later version.
10;;;
11;;; This program is distributed in the hope that it will be useful,
12;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of the GNU General Public License
17;;; along with this program; if not, write to the Free Software
18;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20(sys::%in-package "SYSTEM")
21
22(setq *autoload-verbose* nil)
23(setq *load-verbose* nil)
24
25(defmacro in-package (name)
26  (list 'sys::%in-package (string name)))
27
28(defmacro lambda (lambda-list &rest body)
29  (list 'function (list* 'lambda lambda-list body)))
30
31(defmacro when (pred &rest body)
32  (list 'if pred (if (> (length body) 1)
33                     (append '(progn) body)
34                     (car body))))
35
36(defmacro unless (pred &rest body)
37  (list 'if (list 'not pred) (if (> (length body) 1)
38                                 (append '(progn) body)
39                                 (car body))))
40
41(defmacro return (&optional result)
42  (list 'return-from nil result))
43
44(defmacro defun (name lambda-list &rest body)
45  (list 'sys::%defun (list 'QUOTE name) (list 'QUOTE lambda-list) (list 'QUOTE body)))
46
47(defmacro defconstant (name initial-value &optional docstring)
48  (list 'sys::%defconstant (list 'QUOTE name) initial-value docstring))
49
50(defmacro defparameter (name initial-value &optional docstring)
51  (list 'sys::%defparameter (list 'QUOTE name) initial-value docstring))
52
53;; EVAL is redefined in precompiler.lisp.
54(defun eval (form)
55  (sys::%eval form))
56
57(defun terpri (&optional output-stream)
58  (sys::%terpri output-stream))
59
60(defun fresh-line (&optional output-stream)
61  (sys::%fresh-line output-stream))
62
63(defun write-char (character &optional output-stream)
64  (sys::%write-char character output-stream))
65
66(defun simple-format (destination control-string &rest args)
67  (apply *simple-format-function* destination control-string args))
68
69(export 'simple-format '#:system)
70
71;; INVOKE-DEBUGGER is redefined in debug.lisp.
72(defun invoke-debugger (condition)
73  (sys::%format t "~A~%" condition)
74  (ext:quit))
75
76(load-system-file "autoloads")
77(load-system-file "early-defuns")
78(load-system-file "backquote")
79(load-system-file "setf")
80(load-system-file "fdefinition")
81(load-system-file "documentation")
82
83(defmacro defvar (var &optional (val nil valp) (doc nil docp))
84  `(progn
85     (sys::%defvar ',var)
86     ,@(when valp
87         `((unless (boundp ',var)
88             (setq ,var ,val))))
89     ,@(when docp
90         `((sys::%set-documentation ',var 'variable ',doc)))
91     ',var))
92
93(defun make-package (package-name &key nicknames use)
94  (sys::%make-package package-name nicknames use))
95
96(defun make-keyword (symbol)
97  (intern (symbol-name symbol) +keyword-package+))
98
99(defun featurep (form)
100  (cond ((atom form)
101         (ext:memq form *features*))
102        ((eq (car form) :not)
103         (not (featurep (cadr form))))
104        ((eq (car form) :and)
105         (dolist (subform (cdr form) t)
106           (unless (featurep subform) (return))))
107        ((eq (car form) :or)
108         (dolist (subform (cdr form) nil)
109           (when (featurep subform) (return t))))
110        (t
111         (error "READ-FEATURE"))))
112
113(export 'featurep '#:system)
114
115;;; READ-CONDITIONAL (from OpenMCL)
116(defun read-feature (stream)
117  (let* ((f (let* ((*package* +keyword-package+))
118              (read stream t nil t))))
119    (if (featurep f) #\+ #\-)))
120
121(defun read-conditional (stream subchar int)
122  (cond (*read-suppress*
123         (read stream t nil t)
124         (values))
125        ((eql subchar (read-feature stream))
126         (read stream t nil t))
127        (t
128         (let ((*read-suppress* t))
129           (read stream t nil t)
130           (values)))))
131
132(set-dispatch-macro-character #\# #\+ #'read-conditional *standard-readtable*)
133(set-dispatch-macro-character #\# #\- #'read-conditional *standard-readtable*)
134
135
136
137;;; Reading circular data: the #= and ## reader macros (from SBCL)
138
139;;; Objects already seen by CIRCLE-SUBST.
140(defvar *sharp-equal-circle-table*)
141
142;; This function is kind of like NSUBLIS, but checks for circularities and
143;; substitutes in arrays and structures as well as lists. The first arg is an
144;; alist of the things to be replaced assoc'd with the things to replace them.
145(defun circle-subst (old-new-alist tree)
146  (cond ((not (typep tree
147                     '(or cons (array t) structure-object standard-object)))
148         (let ((entry (find tree old-new-alist :key #'second)))
149           (if entry (third entry) tree)))
150        ((null (gethash tree *sharp-equal-circle-table*))
151         (setf (gethash tree *sharp-equal-circle-table*) t)
152         (cond
153          ((typep tree 'structure-object)
154           (do ((i 0 (1+ i))
155                (end (structure-length tree)))
156               ((= i end))
157             (let* ((old (%structure-ref tree i))
158                    (new (circle-subst old-new-alist old)))
159               (unless (eq old new)
160                 (%structure-set tree i new)))))
161;;           ((typep tree 'standard-object)
162;;            (do ((i 1 (1+ i))
163;;                 (end (%instance-length tree)))
164;;                ((= i end))
165;;              (let* ((old (%instance-ref tree i))
166;;                     (new (circle-subst old-new-alist old)))
167;;                (unless (eq old new)
168;;                  (setf (%instance-ref tree i) new)))))
169          ((arrayp tree)
170           (do ((i 0 (1+ i))
171                (end (array-total-size tree)))
172               ((>= i end))
173             (let* ((old (row-major-aref tree i))
174                    (new (circle-subst old-new-alist old)))
175               (unless (eq old new)
176                 (setf (row-major-aref tree i) new)))))
177         (t
178          (let ((a (circle-subst old-new-alist (car tree)))
179                (d (circle-subst old-new-alist (cdr tree))))
180            (unless (eq a (car tree))
181              (rplaca tree a))
182            (unless (eq d (cdr tree))
183              (rplacd tree d)))))
184        tree)
185  (t tree)))
186
187;;; Sharp-equal works as follows. When a label is assigned (i.e. when
188;;; #= is called) we GENSYM a symbol is which is used as an
189;;; unforgeable tag. *SHARP-SHARP-ALIST* maps the integer tag to this
190;;; gensym.
191;;;
192;;; When SHARP-SHARP encounters a reference to a label, it returns the
193;;; symbol assoc'd with the label. Resolution of the reference is
194;;; deferred until the read done by #= finishes. Any already resolved
195;;; tags (in *SHARP-EQUAL-ALIST*) are simply returned.
196;;;
197;;; After reading of the #= form is completed, we add an entry to
198;;; *SHARP-EQUAL-ALIST* that maps the gensym tag to the resolved
199;;; object. Then for each entry in the *SHARP-SHARP-ALIST, the current
200;;; object is searched and any uses of the gensysm token are replaced
201;;; with the actual value.
202
203(defvar *sharp-sharp-alist* ())
204
205(defun sharp-equal (stream ignore label)
206  (declare (ignore ignore))
207  (when *read-suppress* (return-from sharp-equal (values)))
208  (unless label
209    (error 'reader-error
210           :stream stream
211           :format-control "Missing label for #="))
212  (when (or (assoc label *sharp-sharp-alist*)
213            (assoc label *sharp-equal-alist*))
214    (error 'reader-error
215           :stream stream
216           :format-control "Multiply defined label: #~D="
217           :format-arguments (list label)))
218  (let* ((tag (gensym))
219         (*sharp-sharp-alist* (acons label tag *sharp-sharp-alist*))
220         (obj (read stream t nil t)))
221    (when (eq obj tag)
222      (error 'reader-error
223             :stream stream
224             :format-control "Must tag something more than just #~D#"
225             :format-arguments (list label)))
226    (push (list label tag obj) *sharp-equal-alist*)
227    (let ((*sharp-equal-circle-table* (make-hash-table :test 'eq :size 20)))
228      (circle-subst *sharp-equal-alist* obj))))
229
230(defun sharp-sharp (stream ignore label)
231  (declare (ignore ignore))
232  (when *read-suppress* (return-from sharp-sharp nil))
233  (unless label
234    (error 'reader-error :stream stream :format-control "Missing label for ##"))
235  (let ((entry (assoc label *sharp-equal-alist*)))
236    (if entry
237        (third entry)
238        (let ((pair (assoc label *sharp-sharp-alist*)))
239          (unless pair
240            (error 'reader-error
241                   :stream stream
242                   :format-control "Object is not labelled #~S#"
243                   :format-arguments (list label)))
244          (cdr pair)))))
245
246(set-dispatch-macro-character #\# #\= #'sharp-equal *standard-readtable*)
247(set-dispatch-macro-character #\# #\# #'sharp-sharp *standard-readtable*)
248
249
250(copy-readtable *standard-readtable* *readtable*)
251
252;; SYS::%COMPILE is redefined in precompiler.lisp.
253(defun sys::%compile (name definition)
254  (values (if name name definition) nil nil))
255
256(load-system-file "macros")
257(load-system-file "fixme")
258(load-system-file "destructuring-bind")
259(load-system-file "arrays")
260(load-system-file "compiler-macro")
261(load-system-file "subtypep")
262(load-system-file "typep")
263(load-system-file "precompiler")
264
265(precompile-package "PRECOMPILER")
266(precompile-package "EXTENSIONS")
267(precompile-package "SYSTEM")
268(precompile-package "COMMON-LISP")
269
270(load-system-file "signal")
271(load-system-file "list")
272(load-system-file "sequences")
273(load-system-file "error")
274(load-system-file "defpackage")
275(load-system-file "define-modify-macro")
276
277;;; Package definitions.
278(defpackage "FORMAT" (:use "CL" "EXT"))
279
280(defpackage "XP"
281  (:use "CL")
282  (:export
283   #:output-pretty-object))
284
285;;; PROVIDE, REQUIRE (from SBCL)
286(defun provide (module-name)
287  (pushnew (string module-name) *modules* :test #'string=)
288  t)
289
290(defun require (module-name &optional pathnames)
291  (unless (member (string module-name) *modules* :test #'string=)
292    (let ((saved-modules (copy-list *modules*)))
293      (cond (pathnames
294             (unless (listp pathnames) (setf pathnames (list pathnames)))
295             (dolist (x pathnames)
296               (load x)))
297            (t
298             (let ((*readtable* (copy-readtable nil)))
299               (load-system-file (string-downcase (string module-name))))))
300      (set-difference *modules* saved-modules))))
301
302(defun read-from-string (string &optional (eof-error-p t) eof-value
303                                &key (start 0) end preserve-whitespace)
304  (sys::%read-from-string string eof-error-p eof-value start end preserve-whitespace))
305
306(defconstant lambda-list-keywords
307  '(&optional &rest &key &aux &body &whole &allow-other-keys &environment))
308
309(defconstant call-arguments-limit 50)
310
311(defconstant lambda-parameters-limit 50)
312
313(defconstant multiple-values-limit 20)
314
315(defconstant internal-time-units-per-second 1000)
316
317(load-system-file "restart")
318(load-system-file "late-setf")
319(load-system-file "debug")
320(load-system-file "print")
321(load-system-file "pprint-dispatch")
322(load-system-file "pprint")
323(load-system-file "defsetf")
324
325(unless (sys::featurep :j)
326  (load-system-file "top-level")
327  (%format t "Startup completed in ~A seconds.~%" (float (/ (ext:uptime) 1000))))
Note: See TracBrowser for help on using the repository browser.