0.9.3.33
[sbcl.git] / src / compiler / fndb.lisp
1 ;;;; This file defines all the standard functions to be known
2 ;;;; functions. Each function has type and side-effect information,
3 ;;;; and may also have IR1 optimizers.
4
5 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; more information.
7 ;;;;
8 ;;;; This software is derived from the CMU CL system, which was
9 ;;;; written at Carnegie Mellon University and released into the
10 ;;;; public domain. The software is in the public domain and is
11 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
12 ;;;; files for more information.
13
14 (in-package "SB!C")
15 \f
16 ;;;; information for known functions:
17
18 (defknown coerce (t type-specifier) t
19   ;; Note:
20   ;; This is not FLUSHABLE because it's defined to signal errors.
21   (movable)
22   ;; :DERIVE-TYPE RESULT-TYPE-SPEC-NTH-ARG 2 ? Nope... (COERCE 1 'COMPLEX)
23   ;; returns REAL/INTEGER, not COMPLEX.
24   )
25 (defknown list-to-vector* (list type-specifier) vector)
26 (defknown vector-to-vector* (vector type-specifier) vector)
27
28 (defknown type-of (t) t (foldable flushable))
29
30 ;;; These can be affected by type definitions, so they're not FOLDABLE.
31 (defknown (sb!xc:upgraded-complex-part-type sb!xc:upgraded-array-element-type)
32           (type-specifier &optional lexenv-designator) type-specifier
33   (unsafely-flushable))
34 \f
35 ;;;; from the "Predicates" chapter:
36
37 ;;; FIXME: Is it right to have TYPEP (and TYPE-OF, elsewhere; and
38 ;;; perhaps SPECIAL-OPERATOR-P and others) be FOLDABLE in the
39 ;;; cross-compilation host? After all, some type relationships (e.g.
40 ;;; FIXNUMness) might be different between host and target. Perhaps
41 ;;; this property should be protected by #-SB-XC-HOST? Perhaps we need
42 ;;; 3-stage bootstrapping after all? (Ugh! It's *so* slow already!)
43 (defknown typep (t type-specifier &optional lexenv-designator) t
44    ;; Unlike SUBTYPEP or UPGRADED-ARRAY-ELEMENT-TYPE and friends, this
45    ;; seems to be FOLDABLE. Like SUBTYPEP, it's affected by type
46    ;; definitions, but unlike SUBTYPEP, there should be no way to make
47    ;; a TYPEP expression with constant arguments which doesn't return
48    ;; an error before the type declaration (because of undefined
49    ;; type). E.g. you can do
50    ;;   (SUBTYPEP 'INTEGER 'FOO) => NIL, NIL
51    ;;   (DEFTYPE FOO () T)
52    ;;   (SUBTYPEP 'INTEGER 'FOO) => T, T
53    ;; but the analogous
54    ;;   (TYPEP 12 'FOO)
55    ;;   (DEFTYPE FOO () T)
56    ;;   (TYPEP 12 'FOO)
57    ;; doesn't work because the first call is an error.
58    ;;
59    ;; (UPGRADED-ARRAY-ELEMENT-TYPE and UPGRADED-COMPLEX-PART-TYPE have
60    ;; behavior like SUBTYPEP in this respect, not like TYPEP.)
61    (foldable))
62 (defknown subtypep (type-specifier type-specifier &optional lexenv-designator)
63   (values boolean boolean)
64   ;; This is not FOLDABLE because its value is affected by type
65   ;; definitions.
66   ;;
67   ;; FIXME: Is it OK to fold this when the types have already been
68   ;; defined? Does the code inherited from CMU CL already do this?
69   (unsafely-flushable))
70
71 (defknown (null symbolp atom consp listp numberp integerp rationalp floatp
72                 complexp characterp stringp bit-vector-p vectorp
73                 simple-vector-p simple-string-p simple-bit-vector-p arrayp
74                 sb!xc:packagep functionp compiled-function-p not)
75   (t) boolean (movable foldable flushable))
76
77 (defknown (eq eql) (t t) boolean (movable foldable flushable))
78 (defknown (equal equalp) (t t) boolean (foldable flushable recursive))
79 \f
80 ;;;; classes
81
82 (sb!xc:deftype name-for-class () t)
83 (defknown classoid-name (classoid) name-for-class (flushable))
84 (defknown find-classoid (name-for-class &optional t lexenv-designator)
85   (or classoid null) ())
86 (defknown classoid-of (t) classoid (flushable))
87 (defknown layout-of (t) layout (flushable))
88 (defknown copy-structure (structure-object) structure-object
89   (flushable unsafe))
90 \f
91 ;;;; from the "Control Structure" chapter:
92
93 ;;; This is not FLUSHABLE, since it's required to signal an error if
94 ;;; unbound.
95 (defknown (symbol-value) (symbol) t ())
96 ;;; From CLHS, "If the symbol is globally defined as a macro or a
97 ;;; special operator, an object of implementation-dependent nature and
98 ;;; identity is returned. If the symbol is not globally defined as
99 ;;; either a macro or a special operator, and if the symbol is fbound,
100 ;;; a function object is returned".  Our objects of
101 ;;; implementation-dependent nature happen to be functions.
102 (defknown (symbol-function) (symbol) function ())
103
104 (defknown boundp (symbol) boolean (flushable))
105 (defknown fboundp ((or symbol cons)) boolean (unsafely-flushable explicit-check))
106 (defknown special-operator-p (symbol) t
107   ;; The set of special operators never changes.
108   (movable foldable flushable))
109 (defknown set (symbol t) t (unsafe)
110   :derive-type #'result-type-last-arg)
111 (defknown fdefinition ((or symbol cons)) function (unsafe explicit-check))
112 (defknown %set-fdefinition ((or symbol cons) function) function
113   (unsafe explicit-check))
114 (defknown makunbound (symbol) symbol)
115 (defknown fmakunbound ((or symbol cons)) (or symbol cons)
116   (unsafe explicit-check))
117 (defknown (get-setf-method get-setf-method-multiple-value)
118   ((or list symbol) &optional lexenv-designator)
119   (values list list list form form)
120   (flushable))
121 (defknown apply (callable t &rest t) *) ; ### Last arg must be List...
122 (defknown funcall (callable &rest t) *)
123
124 (defknown (mapcar maplist) (callable list &rest list) list
125   (call))
126
127 ;;; According to CLHS the result must be a LIST, but we do not check
128 ;;; it.
129 (defknown (mapcan mapcon) (callable list &rest list) t
130   (call))
131
132 (defknown (mapc mapl) (callable list &rest list) list (foldable call))
133
134 ;;; We let VALUES-LIST be foldable, since constant-folding will turn
135 ;;; it into VALUES. VALUES is not foldable, since MV constants are
136 ;;; represented by a call to VALUES.
137 (defknown values (&rest t) * (movable flushable unsafe))
138 (defknown values-list (list) * (movable foldable unsafely-flushable))
139 \f
140 ;;;; from the "Macros" chapter:
141
142 (defknown macro-function (symbol &optional lexenv-designator)
143   (or function null)
144   (flushable))
145 (defknown (macroexpand macroexpand-1) (t &optional lexenv-designator)
146   (values form &optional boolean))
147
148 (defknown compiler-macro-function (t &optional lexenv-designator)
149   (or function null)
150   (flushable))
151 \f
152 ;;;; from the "Declarations" chapter:
153
154 (defknown proclaim (list) (values) (recursive))
155
156 ;;;; from the "Symbols" chapter:
157
158 (defknown get (symbol t &optional t) t (flushable))
159 (defknown sb!impl::get2 (symbol t) t (flushable))
160 (defknown sb!impl::get3 (symbol t t) t (flushable))
161 (defknown remprop (symbol t) t)
162 (defknown symbol-plist (symbol) list (flushable))
163 (defknown getf (list t &optional t) t (foldable flushable))
164 (defknown get-properties (list list) (values t t list) (foldable flushable))
165 (defknown symbol-name (symbol) simple-string (movable foldable flushable))
166 (defknown make-symbol (string) symbol (flushable))
167 (defknown copy-symbol (symbol &optional t) symbol (flushable))
168 (defknown gensym (&optional (or string unsigned-byte)) symbol ())
169 (defknown symbol-package (symbol) (or sb!xc:package null) (flushable))
170 (defknown keywordp (t) boolean (flushable))       ; If someone uninterns it...
171 \f
172 ;;;; from the "Packages" chapter:
173
174 (defknown gentemp (&optional string package-designator) symbol)
175
176 (defknown make-package (string-designator &key
177                                           (:use list)
178                                           (:nicknames list)
179                                           ;; ### extensions...
180                                           (:internal-symbols index)
181                                           (:external-symbols index))
182   sb!xc:package)
183 (defknown find-package (package-designator) (or sb!xc:package null)
184   (flushable))
185 (defknown package-name (package-designator) (or simple-string null)
186   (unsafely-flushable))
187 (defknown package-nicknames (package-designator) list (unsafely-flushable))
188 (defknown rename-package (package-designator package-designator &optional list)
189   sb!xc:package)
190 (defknown package-use-list (package-designator) list (unsafely-flushable))
191 (defknown package-used-by-list (package-designator) list (unsafely-flushable))
192 (defknown package-shadowing-symbols (package-designator) list (unsafely-flushable))
193 (defknown list-all-packages () list (flushable))
194 (defknown intern (string &optional package-designator)
195   (values symbol (member :internal :external :inherited nil))
196   ())
197 (defknown find-symbol (string &optional package-designator)
198   (values symbol (member :internal :external :inherited nil))
199   (flushable))
200 (defknown (export import) (symbols-designator &optional package-designator)
201   (eql t))
202 (defknown unintern (symbol &optional package-designator) boolean)
203 (defknown unexport (symbols-designator &optional package-designator) (eql t))
204 (defknown shadowing-import (symbols-designator &optional package-designator)
205   (eql t))
206 (defknown shadow ((or symbol string list) &optional package-designator)
207   (eql t))
208 (defknown (use-package unuse-package)
209   ((or list package-designator) &optional package-designator) (eql t))
210 (defknown find-all-symbols (string-designator) list (flushable))
211 \f
212 ;;;; from the "Numbers" chapter:
213
214 (defknown zerop (number) boolean (movable foldable flushable explicit-check))
215 (defknown (plusp minusp) (real) boolean
216   (movable foldable flushable explicit-check))
217 (defknown (oddp evenp) (integer) boolean
218   (movable foldable flushable explicit-check))
219 (defknown (= /=) (number &rest number) boolean
220   (movable foldable flushable explicit-check))
221 (defknown (< > <= >=) (real &rest real) boolean
222   (movable foldable flushable explicit-check))
223 (defknown (max min) (real &rest real) real
224   (movable foldable flushable explicit-check))
225
226 (defknown + (&rest number) number
227   (movable foldable flushable explicit-check))
228 (defknown - (number &rest number) number
229   (movable foldable flushable explicit-check))
230 (defknown * (&rest number) number
231   (movable foldable flushable explicit-check))
232 (defknown / (number &rest number) number
233   (movable foldable flushable explicit-check))
234 (defknown (1+ 1-) (number) number
235   (movable foldable flushable explicit-check))
236
237 (defknown conjugate (number) number
238   (movable foldable flushable explicit-check))
239
240 (defknown gcd (&rest integer) unsigned-byte
241   (movable foldable flushable explicit-check)
242   #|:derive-type 'boolean-result-type|#)
243 (defknown lcm (&rest integer) unsigned-byte
244   (movable foldable flushable explicit-check))
245
246 #+sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
247 (defknown exp (number) irrational
248   (movable foldable flushable explicit-check recursive)
249   :derive-type #'result-type-float-contagion)
250
251 #-sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
252 (defknown exp (number) irrational
253   (movable foldable flushable explicit-check recursive))
254
255 (defknown expt (number number) number
256   (movable foldable flushable explicit-check recursive))
257 (defknown log (number &optional real) irrational
258   (movable foldable flushable explicit-check))
259 (defknown sqrt (number) irrational
260   (movable foldable flushable explicit-check))
261 (defknown isqrt (unsigned-byte) unsigned-byte
262   (movable foldable flushable explicit-check recursive))
263
264 (defknown (abs phase signum) (number) number
265   (movable foldable flushable explicit-check))
266 (defknown cis (real) (complex float)
267   (movable foldable flushable explicit-check))
268
269 #+sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
270 (progn
271 (defknown (sin cos) (number)
272   (or (float -1.0 1.0) (complex float))
273   (movable foldable flushable explicit-check recursive)
274   :derive-type #'result-type-float-contagion)
275
276 (defknown atan
277   (number &optional real) irrational
278   (movable foldable unsafely-flushable explicit-check recursive)
279   :derive-type #'result-type-float-contagion)
280
281 (defknown (tan sinh cosh tanh asinh)
282   (number) irrational (movable foldable flushable explicit-check recursive)
283   :derive-type #'result-type-float-contagion)
284 ) ; PROGN
285
286 #-sb-xc-host ; (See CROSS-FLOAT-INFINITY-KLUDGE.)
287 (progn
288 (defknown (sin cos) (number)
289   (or (float -1.0 1.0) (complex float))
290   (movable foldable flushable explicit-check recursive))
291
292 (defknown atan
293   (number &optional real) irrational
294   (movable foldable unsafely-flushable explicit-check recursive))
295
296 (defknown (tan sinh cosh tanh asinh)
297   (number) irrational (movable foldable flushable explicit-check recursive))
298 ) ; PROGN
299
300 (defknown (asin acos acosh atanh)
301   (number) irrational
302   (movable foldable flushable explicit-check recursive))
303
304 (defknown float (real &optional float) float
305   (movable foldable flushable explicit-check))
306
307 (defknown (rational) (real) rational
308   (movable foldable flushable explicit-check))
309
310 (defknown (rationalize) (real) rational
311   (movable foldable flushable explicit-check recursive))
312
313 (defknown (numerator denominator) (rational) integer
314   (movable foldable flushable))
315
316 (defknown (floor ceiling truncate round)
317   (real &optional real) (values integer real)
318   (movable foldable flushable explicit-check))
319
320 (defknown (mod rem) (real real) real
321   (movable foldable flushable explicit-check))
322
323 (defknown (ffloor fceiling fround ftruncate)
324   (real &optional real) (values float real)
325   (movable foldable flushable explicit-check))
326
327 (defknown decode-float (float) (values float float-exponent float)
328   (movable foldable flushable explicit-check))
329 (defknown scale-float (float integer) float
330   (movable foldable unsafely-flushable explicit-check))
331 (defknown float-radix (float) float-radix
332   (movable foldable flushable))
333 (defknown float-sign (float &optional float) float
334   (movable foldable flushable explicit-check))
335 (defknown (float-digits float-precision) (float) float-digits
336   (movable foldable flushable explicit-check))
337 (defknown integer-decode-float (float)
338           (values integer float-int-exponent (member -1 1))
339           (movable foldable flushable explicit-check))
340
341 (defknown complex (real &optional real) number
342   (movable foldable flushable explicit-check))
343
344 (defknown (realpart imagpart) (number) real (movable foldable flushable))
345
346 (defknown (logior logxor logand logeqv) (&rest integer) integer
347   (movable foldable flushable explicit-check))
348
349 (defknown (lognand lognor logandc1 logandc2 logorc1 logorc2)
350           (integer integer) integer
351   (movable foldable flushable explicit-check))
352
353 (defknown boole (boole-code integer integer) integer
354   (movable foldable flushable))
355
356 (defknown lognot (integer) integer (movable foldable flushable explicit-check))
357 (defknown logtest (integer integer) boolean (movable foldable flushable))
358 (defknown logbitp (unsigned-byte integer) boolean (movable foldable flushable))
359 (defknown ash (integer integer) integer
360   (movable foldable flushable explicit-check))
361 (defknown (logcount integer-length) (integer) bit-index
362   (movable foldable flushable explicit-check))
363 ;;; FIXME: According to the ANSI spec, it's legal to use any
364 ;;; nonnegative indices for BYTE arguments, not just BIT-INDEX. It's
365 ;;; hard to come up with useful ways to do this, but it is possible to
366 ;;; come up with *legal* ways to do this, so it would be nice
367 ;;; to fix this so we comply with the spec.
368 (defknown byte (bit-index bit-index) byte-specifier
369   (movable foldable flushable))
370 (defknown (byte-size byte-position) (byte-specifier) bit-index
371   (movable foldable flushable))
372 (defknown ldb (byte-specifier integer) integer (movable foldable flushable))
373 (defknown ldb-test (byte-specifier integer) boolean
374   (movable foldable flushable))
375 (defknown mask-field (byte-specifier integer) integer
376   (movable foldable flushable))
377 (defknown dpb (integer byte-specifier integer) integer
378   (movable foldable flushable))
379 (defknown deposit-field (integer byte-specifier integer) integer
380   (movable foldable flushable))
381 (defknown random ((or (float (0.0)) (integer 1)) &optional random-state)
382   (or (float 0.0) (integer 0)) ())
383 (defknown make-random-state (&optional (or (member nil t) random-state))
384   random-state (flushable))
385 (defknown random-state-p (t) boolean (movable foldable flushable))
386 \f
387 ;;;; from the "Characters" chapter:
388 (defknown (standard-char-p graphic-char-p alpha-char-p
389                            upper-case-p lower-case-p both-case-p alphanumericp)
390   (character) boolean (movable foldable flushable))
391
392 (defknown digit-char-p (character &optional (integer 2 36))
393   (or (integer 0 35) null) (movable foldable flushable))
394
395 (defknown (char= char/= char< char> char<= char>= char-equal char-not-equal
396                  char-lessp char-greaterp char-not-greaterp char-not-lessp)
397   (character &rest character) boolean (movable foldable flushable))
398
399 (defknown character (t) character (movable foldable unsafely-flushable))
400 (defknown char-code (character) char-code (movable foldable flushable))
401 (defknown (char-upcase char-downcase) (character) character
402   (movable foldable flushable))
403 (defknown digit-char (unsigned-byte &optional (integer 2 36))
404   (or character null) (movable foldable flushable))
405 (defknown char-int (character) char-code (movable foldable flushable))
406 (defknown char-name (character) (or simple-string null)
407   (movable foldable flushable))
408 (defknown name-char (string-designator) (or character null)
409   (movable foldable flushable))
410 (defknown code-char (char-code) character
411   ;; By suppressing constant folding on CODE-CHAR when the
412   ;; cross-compiler is running in the cross-compilation host vanilla
413   ;; ANSI Common Lisp, we can use CODE-CHAR expressions to delay until
414   ;; target Lisp run time the generation of CHARACTERs which aren't
415   ;; STANDARD-CHARACTERs. That way, we don't need to rely on the host
416   ;; Common Lisp being able to handle any characters other than those
417   ;; guaranteed by the ANSI spec.
418   (movable #-sb-xc-host foldable flushable))
419 \f
420 ;;;; from the "Sequences" chapter:
421
422 (defknown elt (sequence index) t (foldable unsafely-flushable))
423
424 (defknown subseq (sequence index &optional sequence-end) consed-sequence
425   (flushable)
426   :derive-type (sequence-result-nth-arg 1))
427
428 (defknown copy-seq (sequence) consed-sequence (flushable)
429   :derive-type (sequence-result-nth-arg 1))
430
431 (defknown length (sequence) index (foldable flushable))
432
433 (defknown reverse (sequence) consed-sequence (flushable)
434   :derive-type (sequence-result-nth-arg 1))
435
436 (defknown nreverse (sequence) sequence ()
437   :derive-type #'result-type-first-arg)
438
439 (defknown make-sequence (type-specifier index
440                                         &key
441                                         (:initial-element t))
442   consed-sequence
443   (movable unsafe)
444   :derive-type (creation-result-type-specifier-nth-arg 1))
445
446 (defknown concatenate (type-specifier &rest sequence) consed-sequence
447   ()
448   :derive-type (creation-result-type-specifier-nth-arg 1))
449
450 (defknown (map %map) (type-specifier callable sequence &rest sequence)
451   consed-sequence
452   (call)
453 ; :DERIVE-TYPE 'TYPE-SPEC-ARG1 ? Nope... (MAP NIL ...) returns NULL, not NIL.
454   )
455 (defknown %map-to-list-arity-1 (callable sequence) list (flushable call))
456 (defknown %map-to-simple-vector-arity-1 (callable sequence) simple-vector
457   (flushable call))
458 (defknown %map-to-nil-on-simple-vector (callable simple-vector) null
459   (flushable call))
460 (defknown %map-to-nil-on-vector (callable vector) null (flushable call))
461 (defknown %map-to-nil-on-sequence (callable sequence) null (flushable call))
462
463 (defknown map-into (sequence callable &rest sequence)
464   sequence
465   (call)
466   :derive-type #'result-type-first-arg)
467
468 ;;; returns the result from the predicate...
469 (defknown some (callable sequence &rest sequence) t
470   (foldable unsafely-flushable call))
471
472 (defknown (every notany notevery) (callable sequence &rest sequence) boolean
473   (foldable unsafely-flushable call))
474
475 ;;; unsafe for :INITIAL-VALUE...
476 (defknown reduce (callable
477                   sequence
478                   &key
479                   (:from-end t)
480                   (:start index)
481                   (:end sequence-end)
482                   (:initial-value t)
483                   (:key callable))
484   t
485   (foldable flushable call unsafe))
486
487 (defknown fill (sequence t &key (:start index) (:end sequence-end)) sequence
488   (unsafe)
489   :derive-type #'result-type-first-arg)
490
491 (defknown replace (sequence
492                    sequence
493                    &key
494                    (:start1 index)
495                    (:end1 sequence-end)
496                    (:start2 index)
497                    (:end2 sequence-end))
498   sequence ()
499   :derive-type #'result-type-first-arg)
500
501 (defknown remove
502   (t sequence &key (:from-end t) (:test callable)
503      (:test-not callable) (:start index) (:end sequence-end)
504      (:count sequence-count) (:key callable))
505   consed-sequence
506   (flushable call)
507   :derive-type (sequence-result-nth-arg 2))
508
509 (defknown substitute
510   (t t sequence &key (:from-end t) (:test callable)
511      (:test-not callable) (:start index) (:end sequence-end)
512      (:count sequence-count) (:key callable))
513   consed-sequence
514   (flushable call)
515   :derive-type (sequence-result-nth-arg 3))
516
517 (defknown (remove-if remove-if-not)
518   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
519             (:count sequence-count) (:key callable))
520   consed-sequence
521   (flushable call)
522   :derive-type (sequence-result-nth-arg 2))
523
524 (defknown (substitute-if substitute-if-not)
525   (t callable sequence &key (:from-end t) (:start index) (:end sequence-end)
526      (:count sequence-count) (:key callable))
527   consed-sequence
528   (flushable call)
529   :derive-type (sequence-result-nth-arg 3))
530
531 (defknown delete
532   (t sequence &key (:from-end t) (:test callable)
533      (:test-not callable) (:start index) (:end sequence-end)
534      (:count sequence-count) (:key callable))
535   sequence
536   (flushable call)
537   :derive-type (sequence-result-nth-arg 2))
538
539 (defknown nsubstitute
540   (t t sequence &key (:from-end t) (:test callable)
541      (:test-not callable) (:start index) (:end sequence-end)
542      (:count sequence-count) (:key callable))
543   sequence
544   (flushable call)
545   :derive-type (sequence-result-nth-arg 3))
546
547 (defknown (delete-if delete-if-not)
548   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
549             (:count sequence-count) (:key callable))
550   sequence
551   (flushable call)
552   :derive-type (sequence-result-nth-arg 2))
553
554 (defknown (nsubstitute-if nsubstitute-if-not)
555   (t callable sequence &key (:from-end t) (:start index) (:end sequence-end)
556      (:count sequence-count) (:key callable))
557   sequence
558   (flushable call)
559   :derive-type (sequence-result-nth-arg 3))
560
561 (defknown remove-duplicates
562   (sequence &key (:test callable) (:test-not callable) (:start index)
563             (:from-end t) (:end sequence-end) (:key callable))
564   consed-sequence
565   (unsafely-flushable call)
566   :derive-type (sequence-result-nth-arg 1))
567
568 (defknown delete-duplicates
569   (sequence &key (:test callable) (:test-not callable) (:start index)
570             (:from-end t) (:end sequence-end) (:key callable))
571   sequence
572   (unsafely-flushable call)
573   :derive-type (sequence-result-nth-arg 1))
574
575 (defknown find (t sequence &key (:test callable) (:test-not callable)
576                   (:start index) (:from-end t) (:end sequence-end)
577                   (:key callable))
578   t
579   (foldable flushable call))
580
581 (defknown (find-if find-if-not)
582   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
583             (:key callable))
584   t
585   (foldable flushable call))
586
587 (defknown position (t sequence &key (:test callable) (:test-not callable)
588                       (:start index) (:from-end t) (:end sequence-end)
589                       (:key callable))
590   (or index null)
591   (foldable flushable call))
592
593 (defknown (position-if position-if-not)
594   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
595             (:key callable))
596   (or index null)
597   (foldable flushable call))
598
599 (defknown count (t sequence &key (:test callable) (:test-not callable)
600                       (:start index) (:from-end t) (:end sequence-end)
601                       (:key callable))
602   index
603   (foldable flushable call))
604
605 (defknown (count-if count-if-not)
606   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
607             (:key callable))
608   index
609   (foldable flushable call))
610
611 (defknown (mismatch search)
612   (sequence sequence &key (:from-end t) (:test callable) (:test-not callable)
613             (:start1 index) (:end1 sequence-end)
614             (:start2 index) (:end2 sequence-end)
615             (:key callable))
616   (or index null)
617   (foldable flushable call))
618
619 ;;; not FLUSHABLE, since vector sort guaranteed in-place...
620 (defknown (stable-sort sort) (sequence callable &key (:key callable)) sequence
621   (call)
622   :derive-type (sequence-result-nth-arg 1))
623 (defknown sb!impl::sort-vector (vector index index function (or function null))
624   * ; SORT-VECTOR works through side-effect
625   (call))
626
627 (defknown merge (type-specifier sequence sequence callable
628                                 &key (:key callable))
629   sequence
630   (call)
631   :derive-type (creation-result-type-specifier-nth-arg 1))
632
633 ;;; not FLUSHABLE, despite what CMU CL's DEFKNOWN said..
634 (defknown read-sequence (sequence stream
635                                   &key
636                                   (:start index)
637                                   (:end sequence-end))
638   (index)
639   ())
640
641 (defknown write-sequence (sequence stream
642                                    &key
643                                    (:start index)
644                                    (:end sequence-end))
645   sequence
646   ()
647   :derive-type (sequence-result-nth-arg 1))
648 \f
649 ;;;; from the "Manipulating List Structure" chapter:
650 (defknown (car cdr first rest)
651   (list)
652   t
653   (foldable flushable))
654
655 ;; Correct argument type restrictions for these functions are
656 ;; complicated, so we just declare them to accept LISTs and suppress
657 ;; flushing is safe code.
658 (defknown (caar cadr cdar cddr
659                 caaar caadr cadar caddr cdaar cdadr cddar cdddr
660                 caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
661                 cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
662                 second third fourth fifth sixth seventh eighth ninth tenth)
663   (list)
664   t
665   (foldable unsafely-flushable))
666
667 (defknown cons (t t) cons (movable flushable unsafe))
668
669 (defknown tree-equal (t t &key (:test callable) (:test-not callable)) boolean
670   (foldable flushable call))
671 (defknown endp (list) boolean (foldable flushable movable))
672 (defknown list-length (list) (or index null) (foldable unsafely-flushable))
673 (defknown nth (unsigned-byte list) t (foldable flushable))
674 (defknown nthcdr (unsigned-byte list) t (foldable unsafely-flushable))
675 (defknown last (list &optional unsigned-byte) t (foldable flushable))
676 (defknown sb!impl::last1 (list) t (foldable flushable))
677 (defknown list (&rest t) list (movable flushable unsafe))
678 (defknown list* (t &rest t) t (movable flushable unsafe))
679 (defknown make-list (index &key (:initial-element t)) list
680   (movable flushable unsafe))
681
682 ;;; All but last must be of type LIST, but there seems to be no way to
683 ;;; express that in this syntax.
684 (defknown append (&rest t) t (flushable))
685
686 (defknown copy-list (list) list (flushable))
687 (defknown copy-alist (list) list (flushable))
688 (defknown copy-tree (t) t (flushable recursive))
689 (defknown revappend (list t) t (flushable))
690
691 ;;; All but last must be of type LIST, but there seems to be no way to
692 ;;; express that in this syntax. The result must be LIST, but we do
693 ;;; not check it now :-).
694 (defknown nconc (&rest t) t ())
695 (defknown sb!impl::nconc2 (list t) t ())
696
697 (defknown nreconc (list t) t ())
698 (defknown butlast (list &optional unsigned-byte) list (flushable))
699 (defknown nbutlast (list &optional unsigned-byte) list ())
700 (defknown ldiff (list t) list (flushable))
701 (defknown (rplaca rplacd) (cons t) list (unsafe))
702
703 (defknown (nsubst subst) (t t t &key (:key callable) (:test callable)
704                             (:test-not callable))
705   t (flushable unsafe call))
706
707 (defknown (subst-if subst-if-not nsubst-if nsubst-if-not)
708           (t callable t &key (:key callable))
709   t (flushable unsafe call))
710
711 (defknown (sublis nsublis) (list t &key (:key callable) (:test callable)
712                                  (:test-not callable))
713   t (flushable unsafe call))
714
715 (defknown member (t list &key (:key callable) (:test callable)
716                     (:test-not callable))
717   list (foldable flushable call))
718 (defknown (member-if member-if-not) (callable list &key (:key callable))
719   list (foldable flushable call))
720
721 (defknown tailp (t list) boolean (foldable flushable))
722
723 (defknown adjoin (t list &key (:key callable) (:test callable)
724                     (:test-not callable))
725   list (foldable flushable unsafe call))
726
727 (defknown (union intersection set-difference set-exclusive-or)
728   (list list &key (:key callable) (:test callable) (:test-not callable))
729   list
730   (foldable flushable call))
731
732 (defknown (nunion nintersection nset-difference nset-exclusive-or)
733   (list list &key (:key callable) (:test callable) (:test-not callable))
734   list
735   (foldable flushable call))
736
737 (defknown subsetp
738   (list list &key (:key callable) (:test callable) (:test-not callable))
739   boolean
740   (foldable flushable call))
741
742 (defknown acons (t t t) list (movable flushable unsafe))
743 (defknown pairlis (t t &optional t) list (flushable unsafe))
744
745 (defknown (rassoc assoc)
746           (t list &key (:key callable) (:test callable) (:test-not callable))
747   list (foldable flushable call))
748 (defknown (assoc-if-not assoc-if rassoc-if rassoc-if-not)
749           (callable list &key (:key callable)) list (foldable flushable call))
750
751 (defknown (memq assq) (t list) list (foldable flushable unsafe))
752 (defknown delq (t list) list (flushable unsafe))
753 \f
754 ;;;; from the "Hash Tables" chapter:
755
756 (defknown make-hash-table
757   (&key (:test callable) (:size unsigned-byte)
758         (:rehash-size (or (integer 1) (float (1.0))))
759         (:rehash-threshold (real 0 1))
760         (:weak-p t))
761   hash-table
762   (flushable unsafe))
763 (defknown hash-table-p (t) boolean (movable foldable flushable))
764 (defknown gethash (t hash-table &optional t) (values t boolean)
765   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
766 (defknown sb!impl::gethash2 (t hash-table) (values t boolean)
767   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
768 (defknown sb!impl::gethash3 (t hash-table t) (values t boolean)
769   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
770 (defknown %puthash (t hash-table t) t (unsafe))
771 (defknown remhash (t hash-table) boolean ())
772 (defknown maphash (callable hash-table) null (flushable call))
773 (defknown clrhash (hash-table) hash-table ())
774 (defknown hash-table-count (hash-table) index (flushable))
775 (defknown hash-table-rehash-size (hash-table) (or (integer 1) (float (1.0)))
776   (foldable flushable))
777 (defknown hash-table-rehash-threshold (hash-table) (real 0 1)
778   (foldable flushable))
779 (defknown hash-table-size (hash-table) index (flushable))
780 (defknown hash-table-test (hash-table) symbol (foldable flushable))
781 (defknown sxhash (t) (integer 0 #.sb!xc:most-positive-fixnum)
782   (#-sb-xc-host foldable flushable))
783 \f
784 ;;;; from the "Arrays" chapter
785
786 (defknown make-array ((or index list)
787                       &key
788                       (:element-type type-specifier)
789                       (:initial-element t)
790                       (:initial-contents t)
791                       (:adjustable t)
792                       (:fill-pointer t)
793                       (:displaced-to (or array null))
794                       (:displaced-index-offset index))
795   array (flushable unsafe))
796
797 (defknown vector (&rest t) simple-vector (flushable unsafe))
798
799 (defknown aref (array &rest index) t (foldable))
800 (defknown row-major-aref (array index) t (foldable))
801
802 (defknown array-element-type (array)
803   type-specifier
804   (foldable flushable recursive))
805 (defknown array-rank (array) array-rank (foldable flushable))
806 (defknown array-dimension (array array-rank) index (foldable flushable))
807 (defknown array-dimensions (array) list (foldable flushable))
808 (defknown array-in-bounds-p (array &rest integer) boolean (foldable flushable))
809 (defknown array-row-major-index (array &rest index) array-total-size
810   (foldable flushable))
811 (defknown array-total-size (array) array-total-size (foldable flushable))
812 (defknown adjustable-array-p (array) boolean (movable foldable flushable))
813
814 (defknown svref (simple-vector index) t (foldable flushable))
815 (defknown bit ((array bit) &rest index) bit (foldable flushable))
816 (defknown sbit ((simple-array bit) &rest index) bit (foldable flushable))
817
818 (defknown (bit-and bit-ior bit-xor bit-eqv bit-nand bit-nor bit-andc1 bit-andc2
819                    bit-orc1 bit-orc2)
820   ((array bit) (array bit) &optional (or (array bit) (member t nil)))
821   (array bit)
822   ()
823   #|:derive-type #'result-type-last-arg|#)
824
825 (defknown bit-not ((array bit) &optional (or (array bit) (member t nil)))
826   (array bit)
827   ()
828   #|:derive-type #'result-type-last-arg|#)
829
830 (defknown bit-vector-= (bit-vector bit-vector) boolean
831   (movable foldable flushable))
832
833 (defknown array-has-fill-pointer-p (array) boolean
834   (movable foldable flushable))
835 (defknown fill-pointer (vector) index (foldable unsafely-flushable))
836 (defknown vector-push (t vector) (or index null) ())
837 (defknown vector-push-extend (t vector &optional index) index ())
838 (defknown vector-pop (vector) t ())
839
840 (defknown adjust-array
841   (array (or index list) &key (:element-type type-specifier)
842          (:initial-element t) (:initial-contents t)
843          (:fill-pointer t) (:displaced-to (or array null))
844          (:displaced-index-offset index))
845   array (unsafe))
846 ;  :derive-type 'result-type-arg1) Not even close...
847 \f
848 ;;;; from the "Strings" chapter:
849
850 (defknown char (string index) character (foldable flushable))
851 (defknown schar (simple-string index) character (foldable flushable))
852
853 (defknown (string= string-equal)
854   (string-designator string-designator &key (:start1 index) (:end1 sequence-end)
855               (:start2 index) (:end2 sequence-end))
856   boolean
857   (foldable flushable))
858
859 (defknown (string< string> string<= string>= string/= string-lessp
860                    string-greaterp string-not-lessp string-not-greaterp
861                    string-not-equal)
862   (string-designator string-designator &key (:start1 index) (:end1 sequence-end)
863               (:start2 index) (:end2 sequence-end))
864   (or index null)
865   (foldable flushable))
866
867 (defknown make-string (index &key (:element-type type-specifier)
868                        (:initial-element character))
869   simple-string (flushable))
870
871 (defknown (string-trim string-left-trim string-right-trim)
872   (sequence string-designator) simple-string (flushable))
873
874 (defknown (string-upcase string-downcase string-capitalize)
875   (string-designator &key (:start index) (:end sequence-end))
876   simple-string (flushable))
877
878 (defknown (nstring-upcase nstring-downcase nstring-capitalize)
879   (string &key (:start index) (:end sequence-end))
880   string ())
881
882 (defknown string (string-designator) string
883   (flushable explicit-check))
884 \f
885 ;;;; internal non-keyword versions of string predicates:
886
887 (defknown (string<* string>* string<=* string>=* string/=*)
888   (string-designator string-designator index sequence-end index sequence-end)
889   (or index null)
890   (foldable flushable))
891
892 (defknown string=*
893   (string-designator string-designator index sequence-end index sequence-end)
894   boolean
895   (foldable flushable))
896 \f
897 ;;;; from the "Eval" chapter:
898
899 (defknown eval (t) * (recursive))
900 (defknown constantp (t &optional lexenv-designator) boolean
901   (foldable flushable))
902 \f
903 ;;;; from the "Streams" chapter:
904
905 (defknown make-synonym-stream (symbol) stream (flushable))
906 (defknown make-broadcast-stream (&rest stream) stream (unsafely-flushable))
907 (defknown make-concatenated-stream (&rest stream) stream (unsafely-flushable))
908 (defknown make-two-way-stream (stream stream) stream (unsafely-flushable))
909 (defknown make-echo-stream (stream stream) stream (flushable))
910 (defknown make-string-input-stream (string &optional index sequence-end)
911   stream
912   (flushable unsafe))
913 (defknown make-string-output-stream
914     (&key (:element-type type-specifier))
915     stream
916   (flushable))
917 (defknown get-output-stream-string (stream) simple-string ())
918 (defknown streamp (t) boolean (movable foldable flushable))
919 (defknown stream-element-type (stream) type-specifier
920   (movable foldable flushable))
921 (defknown (output-stream-p input-stream-p) (stream) boolean
922   (movable foldable flushable))
923 (defknown close (stream &key (:abort t)) (eql t) ())
924 \f
925 ;;;; from the "Input/Output" chapter:
926
927 ;;; (The I/O functions are given effects ANY under the theory that
928 ;;; code motion over I/O operations is particularly confusing and not
929 ;;; very important for efficiency.)
930
931 (defknown copy-readtable (&optional (or readtable null) (or readtable null))
932   readtable
933   ())
934 (defknown readtablep (t) boolean (movable foldable flushable))
935
936 (defknown set-syntax-from-char
937   (character character &optional (or readtable null) readtable) (eql t)
938   ())
939
940 (defknown set-macro-character (character callable &optional t readtable)
941   (eql t)
942   (unsafe))
943 (defknown get-macro-character (character &optional (or readtable null))
944   (values callable boolean) (flushable))
945
946 (defknown make-dispatch-macro-character (character &optional t readtable)
947   (eql t) ())
948 (defknown set-dispatch-macro-character
949   (character character callable &optional readtable) function
950   (unsafe))
951 (defknown get-dispatch-macro-character
952   (character character &optional (or readtable null)) (or callable null)
953   ())
954
955 (defknown copy-pprint-dispatch
956   (&optional (or sb!pretty:pprint-dispatch-table null))
957   sb!pretty:pprint-dispatch-table
958   ())
959 (defknown pprint-dispatch
960   (t &optional (or sb!pretty:pprint-dispatch-table null))
961   (values callable boolean)
962   ())
963 (defknown (pprint-fill pprint-linear)
964   (stream-designator t &optional t t)
965   null
966   ())
967 (defknown pprint-tabular
968   (stream-designator t &optional t t unsigned-byte)
969   null
970   ())
971 (defknown pprint-indent
972   ((member :block :current) real &optional stream-designator)
973   null
974   ())
975 (defknown pprint-newline
976   ((member :linear :fill :miser :mandatory) &optional stream-designator)
977   null
978   ())
979 (defknown pprint-tab
980   ((member :line :section :line-relative :section-relative)
981    unsigned-byte unsigned-byte &optional stream-designator)
982   null
983   ())
984 (defknown set-pprint-dispatch
985   (type-specifier (or null callable)
986    &optional real sb!pretty:pprint-dispatch-table)
987   null
988   ())
989
990 ;;; may return any type due to eof-value...
991 (defknown (read read-preserving-whitespace read-char-no-hang read-char)
992   (&optional stream-designator t t t) t (explicit-check))
993
994 (defknown read-delimited-list (character &optional stream-designator t) list
995   (explicit-check))
996 (defknown read-line (&optional stream-designator t t t) (values t boolean)
997   (explicit-check))
998 (defknown unread-char (character &optional stream-designator) t
999   (explicit-check))
1000 (defknown peek-char (&optional (or character (member nil t))
1001                                stream-designator t t t)
1002   t
1003   (explicit-check))
1004 (defknown listen (&optional stream-designator) boolean (flushable explicit-check))
1005
1006 (defknown clear-input (&optional stream-designator) null (explicit-check))
1007
1008 (defknown read-from-string
1009   (string &optional t t
1010           &key
1011           (:start index)
1012           (:end sequence-end)
1013           (:preserve-whitespace t))
1014   (values t index))
1015 (defknown parse-integer
1016   (string &key
1017           (:start index)
1018           (:end sequence-end)
1019           (:radix (integer 2 36))
1020           (:junk-allowed t))
1021   (values (or integer null ()) index))
1022
1023 (defknown read-byte (stream &optional t t) t (explicit-check))
1024
1025 (defknown write
1026   (t &key
1027      (:stream stream-designator)
1028      (:escape t)
1029      (:radix t)
1030      (:base (integer 2 36))
1031      (:circle t)
1032      (:pretty t)
1033      (:level (or unsigned-byte null))
1034      (:readably t)
1035      (:length (or unsigned-byte null))
1036      (:case t)
1037      (:array t)
1038      (:gensym t)
1039      (:lines (or unsigned-byte null))
1040      (:right-margin (or unsigned-byte null))
1041      (:miser-width (or unsigned-byte null))
1042      (:pprint-dispatch t))
1043   t
1044   (any explicit-check)
1045   :derive-type #'result-type-first-arg)
1046
1047 (defknown (prin1 print princ) (t &optional stream-designator)
1048   t
1049   (any explicit-check)
1050   :derive-type #'result-type-first-arg)
1051
1052 ;;; xxx-TO-STRING functions are not foldable because they depend on
1053 ;;; the dynamic environment, the state of the pretty printer dispatch
1054 ;;; table, and probably other run-time factors.
1055 (defknown write-to-string
1056   (t &key (:escape t) (:radix t) (:base (integer 2 36)) (:readably t)
1057      (:circle t) (:pretty t) (:level (or unsigned-byte null))
1058      (:length (or unsigned-byte null)) (:case t) (:array t) (:gensym t)
1059      (:lines (or unsigned-byte null)) (:right-margin (or unsigned-byte null))
1060      (:miser-width (or unsigned-byte null)) (:pprint-dispatch t))
1061   simple-string
1062   (flushable explicit-check))
1063
1064 (defknown (prin1-to-string princ-to-string) (t) simple-string (flushable))
1065
1066 (defknown write-char (character &optional stream-designator) character
1067   (explicit-check))
1068 (defknown (write-string write-line)
1069   (string &optional stream-designator &key (:start index) (:end sequence-end))
1070   string
1071   (explicit-check))
1072
1073 (defknown (terpri finish-output force-output clear-output)
1074   (&optional stream-designator) null
1075   (explicit-check))
1076
1077 (defknown fresh-line (&optional stream-designator) boolean
1078   (explicit-check))
1079
1080 (defknown write-byte (integer stream) integer
1081   (explicit-check))
1082
1083 (defknown format ((or (member nil t) stream string)
1084                   (or string function) &rest t)
1085   (or string null)
1086   (explicit-check))
1087
1088 (defknown (y-or-n-p yes-or-no-p) (&optional string &rest t) boolean
1089   (explicit-check))
1090 \f
1091 ;;;; from the "File System Interface" chapter:
1092
1093 ;;; (No pathname functions are FOLDABLE because they all potentially
1094 ;;; depend on *DEFAULT-PATHNAME-DEFAULTS*, e.g. to provide a default
1095 ;;; host when parsing a namestring. They are not FLUSHABLE because
1096 ;;; parsing of a PATHNAME-DESIGNATOR might signal an error.)
1097
1098 (defknown wild-pathname-p (pathname-designator
1099                            &optional
1100                            (member nil :host :device
1101                                    :directory :name
1102                                    :type :version))
1103   generalized-boolean
1104   ())
1105 (defknown pathname-match-p (pathname-designator pathname-designator)
1106   generalized-boolean
1107   ())
1108 (defknown translate-pathname (pathname-designator
1109                               pathname-designator
1110                               pathname-designator &key)
1111   pathname
1112   ())
1113
1114 (defknown logical-pathname (pathname-designator) logical-pathname ())
1115 (defknown translate-logical-pathname (pathname-designator &key) pathname
1116   (recursive))
1117 (defknown load-logical-pathname-translations (string) t ())
1118 (defknown logical-pathname-translations (logical-host-designator) list ())
1119
1120 (defknown pathname (pathname-designator) pathname (unsafely-flushable))
1121 (defknown truename (pathname-designator) pathname ())
1122
1123 (defknown parse-namestring
1124   (pathname-designator &optional
1125                        (or list host string (member :unspecific))
1126                        pathname-designator
1127                        &key
1128                        (:start index)
1129                        (:end sequence-end)
1130                        (:junk-allowed t))
1131   (values (or pathname null) sequence-end)
1132   ())
1133
1134 (defknown merge-pathnames
1135   (pathname-designator &optional pathname-designator pathname-version)
1136   pathname
1137   (unsafely-flushable))
1138
1139 (defknown make-pathname
1140  (&key (:defaults pathname-designator)
1141        (:host (or string pathname-host))
1142        (:device (or string pathname-device))
1143        (:directory (or pathname-directory string (member :wild)))
1144        (:name (or pathname-name string (member :wild)))
1145        (:type (or pathname-type string (member :wild)))
1146        (:version pathname-version) (:case (member :local :common)))
1147   pathname (unsafely-flushable))
1148
1149 (defknown pathnamep (t) boolean (movable flushable))
1150
1151 (defknown pathname-host (pathname-designator
1152                          &key (:case (member :local :common)))
1153   pathname-host (flushable))
1154 (defknown pathname-device (pathname-designator
1155                            &key (:case (member :local :common)))
1156   pathname-device (flushable))
1157 (defknown pathname-directory (pathname-designator
1158                               &key (:case (member :local :common)))
1159   pathname-directory (flushable))
1160 (defknown pathname-name (pathname-designator
1161                          &key (:case (member :local :common)))
1162   pathname-name (flushable))
1163 (defknown pathname-type (pathname-designator
1164                          &key (:case (member :local :common)))
1165   pathname-type (flushable))
1166 (defknown pathname-version (pathname-designator)
1167   pathname-version (flushable))
1168
1169 (defknown (namestring file-namestring directory-namestring host-namestring)
1170   (pathname-designator) (or simple-string null)
1171   (unsafely-flushable))
1172
1173 (defknown enough-namestring (pathname-designator &optional pathname-designator)
1174   simple-string
1175   (unsafely-flushable))
1176
1177 (defknown user-homedir-pathname (&optional t) pathname (flushable))
1178
1179 (defknown open
1180   (pathname-designator &key
1181                        (:direction (member :input :output :io :probe))
1182                        (:element-type type-specifier)
1183                        (:if-exists (member :error :new-version :rename
1184                                            :rename-and-delete :overwrite
1185                                            :append :supersede nil))
1186                        (:if-does-not-exist (member :error :create nil))
1187                        (:external-format keyword))
1188   (or stream null))
1189
1190 (defknown rename-file (pathname-designator filename)
1191   (values pathname pathname pathname))
1192 (defknown delete-file (pathname-designator) t)
1193 (defknown probe-file (pathname-designator) (or pathname null) ())
1194 (defknown file-write-date (pathname-designator) (or unsigned-byte null)
1195   ())
1196 (defknown file-author (pathname-designator) (or simple-string null)
1197   ())
1198
1199 (defknown file-position (stream &optional
1200                                 (or unsigned-byte (member :start :end)))
1201   (or unsigned-byte (member t nil)))
1202 (defknown file-length (stream) (or unsigned-byte null) (unsafely-flushable))
1203
1204 (defknown load
1205   ((or filename stream)
1206    &key
1207    (:verbose t)
1208    (:print t)
1209    (:if-does-not-exist (member :error :create nil))
1210    (:external-format keyword))
1211   t)
1212
1213 (defknown directory (pathname-designator &key)
1214   list ())
1215 \f
1216 ;;;; from the "Conditions" chapter:
1217
1218 (defknown cell-error-name (cell-error) t)
1219 (defknown error (t &rest t) nil)
1220 (defknown cerror (format-control t &rest t) null)
1221 (defknown invalid-method-error (t format-control &rest t) *) ; FIXME: first arg is METHOD
1222 (defknown method-combination-error (format-control &rest t) *)
1223 (defknown signal (t &rest t) null)
1224 (defknown simple-condition-format-control (condition)
1225   format-control)
1226 (defknown simple-condition-format-arguments (condition)
1227   list)
1228 (defknown warn (t &rest t) null)
1229 (defknown invoke-debugger (condition) nil)
1230 (defknown break (&optional format-control &rest t) null)
1231 (defknown make-condition (type-specifier &rest t) condition)
1232 (defknown compute-restarts (&optional (or condition null)) list)
1233 (defknown find-restart (restart-designator &optional (or condition null))
1234   (or restart null))
1235 (defknown invoke-restart (restart-designator &rest t) *)
1236 (defknown invoke-restart-interactively (restart-designator) *)
1237 (defknown restart-name (restart) symbol)
1238 (defknown (abort muffle-warning) (&optional (or condition null)) nil)
1239 (defknown continue (&optional (or condition null)) null)
1240 (defknown (store-value use-value) (t &optional (or condition null))
1241   null)
1242
1243 ;;; and analogous SBCL extension:
1244 (defknown bug (t &rest t) nil) ; never returns
1245 \f
1246 ;;;; from the "Miscellaneous" Chapter:
1247
1248 (defknown compile ((or symbol cons) &optional (or list function null))
1249   (values (or function symbol cons) boolean boolean))
1250
1251 (defknown compile-file
1252   (pathname-designator
1253    &key
1254
1255    ;; ANSI options
1256    (:output-file (or pathname-designator
1257                      null
1258                      ;; FIXME: This last case is a non-ANSI hack.
1259                      (member t)))
1260    (:verbose t)
1261    (:print t)
1262    (:external-format keyword)
1263
1264    ;; extensions
1265    (:trace-file t)
1266    (:block-compile t))
1267   (values (or pathname null) boolean boolean))
1268
1269 ;; FIXME: consider making (OR CALLABLE CONS) something like
1270 ;; EXTENDED-FUNCTION-DESIGNATOR
1271 (defknown disassemble ((or callable cons) &key
1272                        (:stream stream) (:use-labels t))
1273   null)
1274
1275 (defknown fdocumentation (t symbol)
1276   (or string null)
1277   (flushable))
1278
1279 (defknown describe (t &optional (or stream (member t nil))) (values))
1280 (defknown inspect (t) (values))
1281 (defknown room (&optional (member t nil :default)) (values))
1282 (defknown ed (&optional (or symbol cons filename))
1283   t)
1284 (defknown dribble (&optional filename &key (:if-exists t)) (values))
1285
1286 (defknown apropos      (string-designator &optional package-designator t) (values))
1287 (defknown apropos-list (string-designator &optional package-designator t) list
1288   (flushable))
1289
1290 (defknown get-decoded-time ()
1291   (values (integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1292           (integer 1 12) unsigned-byte (integer 0 6) boolean (rational -24 24))
1293   (flushable))
1294
1295 (defknown get-universal-time () unsigned-byte (flushable))
1296
1297 (defknown decode-universal-time
1298           (unsigned-byte &optional (or null (rational -24 24)))
1299   (values (integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1300           (integer 1 12) unsigned-byte (integer 0 6) boolean (rational -24 24))
1301   (flushable))
1302
1303 (defknown encode-universal-time
1304   ((integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1305    (integer 1 12) unsigned-byte &optional (or null (rational -24 24)))
1306   unsigned-byte
1307   (flushable))
1308
1309 (defknown (get-internal-run-time get-internal-real-time)
1310   () internal-time (flushable))
1311
1312 (defknown sleep ((or (rational 0) (float 0.0))) null)
1313
1314 ;;; Even though ANSI defines LISP-IMPLEMENTATION-TYPE and
1315 ;;; LISP-IMPLEMENTATION-VERSION to possibly punt and return NIL, we
1316 ;;; know that there's no valid reason for our implementations to ever
1317 ;;; do so, so we can safely guarantee that they'll return strings.
1318 (defknown (lisp-implementation-type lisp-implementation-version)
1319   () simple-string (flushable))
1320
1321 ;;; For any of these functions, meaningful information might not be
1322 ;;; available, so -- unlike the related LISP-IMPLEMENTATION-FOO
1323 ;;; functions -- these really can return NIL.
1324 (defknown (machine-type machine-version machine-instance
1325            software-type software-version
1326            short-site-name long-site-name)
1327   () (or simple-string null) (flushable))
1328
1329 (defknown identity (t) t (movable foldable flushable unsafe)
1330   :derive-type #'result-type-first-arg)
1331
1332 (defknown constantly (t) function (movable flushable))
1333 (defknown complement (function) function (movable flushable))
1334 \f
1335 ;;;; miscellaneous extensions
1336
1337 (defknown get-bytes-consed () unsigned-byte (flushable))
1338 (defknown mask-signed-field ((integer 0 *) integer) integer
1339           (movable flushable foldable))
1340
1341 ;;; PCOUNTERs
1342 (defknown incf-pcounter (pcounter unsigned-byte) pcounter)
1343 (defknown pcounter->integer (pcounter) unsigned-byte)
1344 (defknown %incf-pcounter-or-fixnum ((or pcounter fixnum) unsigned-byte)
1345   (or pcounter fixnum))
1346 (defknown pcounter-or-fixnum->integer ((or pcounter fixnum)) unsigned-byte)
1347 \f
1348 ;;;; magical compiler frobs
1349
1350 ;;; We can't fold this in general because of SATISFIES. There is a
1351 ;;; special optimizer anyway.
1352 (defknown %typep (t (or type-specifier ctype)) boolean
1353   (movable flushable explicit-check))
1354 (defknown %instance-typep (t (or type-specifier ctype)) boolean
1355   (movable flushable explicit-check))
1356
1357 (defknown %cleanup-point () t)
1358 (defknown %special-bind (t t) t)
1359 (defknown %special-unbind (t) t)
1360 (defknown %listify-rest-args (t index) list (flushable))
1361 (defknown %more-arg-context (t t) (values t index) (flushable))
1362 (defknown %more-arg (t index) t)
1363 (defknown %more-arg-values (t index index) * (flushable))
1364 (defknown %verify-arg-count (index index) (values))
1365 (defknown %arg-count-error (t) nil)
1366 (defknown %unknown-values () *)
1367 (defknown %catch (t t) t)
1368 (defknown %unwind-protect (t t) t)
1369 (defknown (%catch-breakup %unwind-protect-breakup) () t)
1370 (defknown %lexical-exit-breakup (t) t)
1371 (defknown %continue-unwind (t t t) nil)
1372 (defknown %throw (t &rest t) nil) ; This is MV-called.
1373 (defknown %nlx-entry (t) *)
1374 (defknown %%primitive (t t &rest t) *)
1375 (defknown %pop-values (t) t)
1376 (defknown %nip-values (t t &rest t) (values))
1377 (defknown %allocate-closures (t) *)
1378 (defknown %type-check-error (t t) nil)
1379
1380 ;; FIXME: This function does not return, but due to the implementation
1381 ;; of FILTER-LVAR we cannot write it here.
1382 (defknown %compile-time-type-error (t t t) *)
1383
1384 (defknown %odd-key-args-error () nil)
1385 (defknown %unknown-key-arg-error (t) nil)
1386 (defknown (%ldb %mask-field) (bit-index bit-index integer) unsigned-byte
1387   (movable foldable flushable explicit-check))
1388 (defknown (%dpb %deposit-field) (integer bit-index bit-index integer) integer
1389   (movable foldable flushable explicit-check))
1390 (defknown %negate (number) number (movable foldable flushable explicit-check))
1391 (defknown %check-bound (array index fixnum) index (movable foldable flushable))
1392 (defknown data-vector-ref (simple-array index) t
1393   (foldable explicit-check))
1394 (defknown data-vector-set (array index t) t (unsafe explicit-check))
1395 (defknown hairy-data-vector-ref (array index) t
1396   (foldable explicit-check))
1397 (defknown hairy-data-vector-set (array index t) t (unsafe explicit-check))
1398 (defknown %caller-frame-and-pc () (values t t) (flushable))
1399 (defknown %with-array-data (array index (or index null))
1400   (values (simple-array * (*)) index index index)
1401   (foldable flushable))
1402 (defknown %set-symbol-package (symbol t) t (unsafe))
1403 (defknown %coerce-name-to-fun ((or symbol cons)) function (flushable))
1404 (defknown %coerce-callable-to-fun (callable) function (flushable))
1405 (defknown failed-%with-array-data (t t t) nil)
1406 (defknown %find-position
1407   (t sequence t index sequence-end function function)
1408   (values t (or index null))
1409   (flushable call))
1410 (defknown (%find-position-if %find-position-if-not)
1411   (function sequence t index sequence-end function)
1412   (values t (or index null))
1413   (call))
1414 (defknown effective-find-position-test (callable callable)
1415   function
1416   (flushable foldable))
1417 (defknown effective-find-position-key (callable)
1418   function
1419   (flushable foldable))
1420
1421 (defknown %check-vector-sequence-bounds (vector index sequence-end)
1422   index
1423   (unwind))
1424 ;;; FIXME: including this information here is probably necessary to
1425 ;;; get efficient compilation of the inline expansion of
1426 ;;; %FIND-POSITION-IF, so it should maybe be in a more
1427 ;;; compiler-friendly package (SB-INT?)
1428 (defknown sb!impl::signal-bounding-indices-bad-error
1429     (sequence index sequence-end)
1430   nil) ; never returns
1431
1432
1433 (defknown arg-count-error (t t t t t t) nil (unsafe))
1434 \f
1435 ;;;; SETF inverses
1436
1437 (defknown %aset (array &rest t) t (unsafe))
1438 (defknown %set-row-major-aref (array index t) t (unsafe))
1439 (defknown %rplaca (cons t) t (unsafe))
1440 (defknown %rplacd (cons t) t (unsafe))
1441 (defknown %put (symbol t t) t (unsafe))
1442 (defknown %setelt (sequence index t) t (unsafe))
1443 (defknown %svset (simple-vector index t) t (unsafe))
1444 (defknown %bitset ((array bit) &rest index) bit (unsafe))
1445 (defknown %sbitset ((simple-array bit) &rest index) bit (unsafe))
1446 (defknown %charset (string index character) character (unsafe))
1447 (defknown %scharset (simple-string index character) character (unsafe))
1448 (defknown %set-symbol-value (symbol t) t (unsafe))
1449 (defknown (setf symbol-function) (function symbol) function (unsafe))
1450 (defknown %set-symbol-plist (symbol t) t (unsafe))
1451 (defknown (setf fdocumentation) ((or string null) t symbol)
1452   (or string null)
1453   ())
1454 (defknown %setnth (unsigned-byte list t) t (unsafe))
1455 (defknown %set-fill-pointer (vector index) index (unsafe))
1456 \f
1457 ;;;; ALIEN and call-out-to-C stuff
1458
1459 ;;; 'unsafe' attribute because we store the arg on the stack, which is in
1460 ;;; some sense 'passing it upwards'
1461 (defknown sb!vm::push-word-on-c-stack (system-area-pointer) (values) (unsafe))
1462 (defknown sb!vm::pop-words-from-c-stack (index) (values) ())
1463
1464 #!+linkage-table
1465 (defknown foreign-symbol-dataref-sap (simple-string)
1466   system-area-pointer
1467   (movable flushable))
1468
1469 (defknown foreign-symbol-sap (simple-string &optional boolean)
1470   system-area-pointer
1471   (movable flushable))
1472
1473 (defknown foreign-symbol-address (simple-string &optional boolean)
1474   (values integer boolean)
1475   (movable flushable))
1476
1477 ;;;; miscellaneous internal utilities
1478
1479 (defknown %fun-name (function) t (flushable))
1480 (defknown (setf %fun-name) (t function) t (unsafe))
1481
1482 (defknown policy-quality (policy symbol) policy-quality
1483           (flushable))
1484
1485 (defknown (compiler-abort compiler-error) (string &rest t) nil ())
1486 (defknown (compiler-warn compiler-style-warn) (string &rest t) (values) ())
1487 (defknown (compiler-notify maybe-compiler-notify) ((or string symbol) &rest t)
1488   (values)
1489   ())
1490 (defknown style-warn (string &rest t) null ())
1491