0.9.5.41:
[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 (important-result)
437   :derive-type #'result-type-first-arg
438   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
439
440 (defknown make-sequence (type-specifier index
441                                         &key
442                                         (:initial-element t))
443   consed-sequence
444   (movable unsafe)
445   :derive-type (creation-result-type-specifier-nth-arg 1))
446
447 (defknown concatenate (type-specifier &rest sequence) consed-sequence
448   ()
449   :derive-type (creation-result-type-specifier-nth-arg 1))
450
451 (defknown (map %map) (type-specifier callable sequence &rest sequence)
452   consed-sequence
453   (call)
454 ; :DERIVE-TYPE 'TYPE-SPEC-ARG1 ? Nope... (MAP NIL ...) returns NULL, not NIL.
455   )
456 (defknown %map-to-list-arity-1 (callable sequence) list (flushable call))
457 (defknown %map-to-simple-vector-arity-1 (callable sequence) simple-vector
458   (flushable call))
459 (defknown %map-to-nil-on-simple-vector (callable simple-vector) null
460   (flushable call))
461 (defknown %map-to-nil-on-vector (callable vector) null (flushable call))
462 (defknown %map-to-nil-on-sequence (callable sequence) null (flushable call))
463
464 (defknown map-into (sequence callable &rest sequence)
465   sequence
466   (call)
467   :derive-type #'result-type-first-arg
468   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
469
470 ;;; returns the result from the predicate...
471 (defknown some (callable sequence &rest sequence) t
472   (foldable unsafely-flushable call))
473
474 (defknown (every notany notevery) (callable sequence &rest sequence) boolean
475   (foldable unsafely-flushable call))
476
477 ;;; unsafe for :INITIAL-VALUE...
478 (defknown reduce (callable
479                   sequence
480                   &key
481                   (:from-end t)
482                   (:start index)
483                   (:end sequence-end)
484                   (:initial-value t)
485                   (:key callable))
486   t
487   (foldable flushable call unsafe))
488
489 (defknown fill (sequence t &key (:start index) (:end sequence-end)) sequence
490   (unsafe)
491   :derive-type #'result-type-first-arg
492   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
493
494 (defknown replace (sequence
495                    sequence
496                    &key
497                    (:start1 index)
498                    (:end1 sequence-end)
499                    (:start2 index)
500                    (:end2 sequence-end))
501   sequence ()
502   :derive-type #'result-type-first-arg
503   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
504
505 (defknown remove
506   (t sequence &key (:from-end t) (:test callable)
507      (:test-not callable) (:start index) (:end sequence-end)
508      (:count sequence-count) (:key callable))
509   consed-sequence
510   (flushable call)
511   :derive-type (sequence-result-nth-arg 2))
512
513 (defknown substitute
514   (t t sequence &key (:from-end t) (:test callable)
515      (:test-not callable) (:start index) (:end sequence-end)
516      (:count sequence-count) (:key callable))
517   consed-sequence
518   (flushable call)
519   :derive-type (sequence-result-nth-arg 3))
520
521 (defknown (remove-if remove-if-not)
522   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
523             (:count sequence-count) (:key callable))
524   consed-sequence
525   (flushable call)
526   :derive-type (sequence-result-nth-arg 2))
527
528 (defknown (substitute-if substitute-if-not)
529   (t callable sequence &key (:from-end t) (:start index) (:end sequence-end)
530      (:count sequence-count) (:key callable))
531   consed-sequence
532   (flushable call)
533   :derive-type (sequence-result-nth-arg 3))
534
535 (defknown delete
536   (t sequence &key (:from-end t) (:test callable)
537      (:test-not callable) (:start index) (:end sequence-end)
538      (:count sequence-count) (:key callable))
539   sequence
540   (flushable call important-result)
541   :derive-type (sequence-result-nth-arg 2)
542   :destroyed-constant-args (nth-constant-nonempty-sequence-args 2))
543
544 (defknown nsubstitute
545   (t t sequence &key (:from-end t) (:test callable)
546      (:test-not callable) (:start index) (:end sequence-end)
547      (:count sequence-count) (:key callable))
548   sequence
549   (flushable call)
550   :derive-type (sequence-result-nth-arg 3)
551   :destroyed-constant-args (nth-constant-nonempty-sequence-args 3))
552
553 (defknown (delete-if delete-if-not)
554   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
555             (:count sequence-count) (:key callable))
556   sequence
557   (flushable call important-result)
558   :derive-type (sequence-result-nth-arg 2)
559   :destroyed-constant-args (nth-constant-nonempty-sequence-args 2))
560
561 (defknown (nsubstitute-if nsubstitute-if-not)
562   (t callable sequence &key (:from-end t) (:start index) (:end sequence-end)
563      (:count sequence-count) (:key callable))
564   sequence
565   (flushable call)
566   :derive-type (sequence-result-nth-arg 3)
567   :destroyed-constant-args (nth-constant-nonempty-sequence-args 3))
568
569 (defknown remove-duplicates
570   (sequence &key (:test callable) (:test-not callable) (:start index)
571             (:from-end t) (:end sequence-end) (:key callable))
572   consed-sequence
573   (unsafely-flushable call)
574   :derive-type (sequence-result-nth-arg 1))
575
576 (defknown delete-duplicates
577   (sequence &key (:test callable) (:test-not callable) (:start index)
578             (:from-end t) (:end sequence-end) (:key callable))
579   sequence
580   (unsafely-flushable call important-result)
581   :derive-type (sequence-result-nth-arg 1)
582   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
583
584 (defknown find (t sequence &key (:test callable) (:test-not callable)
585                   (:start index) (:from-end t) (:end sequence-end)
586                   (:key callable))
587   t
588   (foldable flushable call))
589
590 (defknown (find-if find-if-not)
591   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
592             (:key callable))
593   t
594   (foldable flushable call))
595
596 (defknown position (t sequence &key (:test callable) (:test-not callable)
597                       (:start index) (:from-end t) (:end sequence-end)
598                       (:key callable))
599   (or index null)
600   (foldable flushable call))
601
602 (defknown (position-if position-if-not)
603   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
604             (:key callable))
605   (or index null)
606   (foldable flushable call))
607
608 (defknown count (t sequence &key (:test callable) (:test-not callable)
609                       (:start index) (:from-end t) (:end sequence-end)
610                       (:key callable))
611   index
612   (foldable flushable call))
613
614 (defknown (count-if count-if-not)
615   (callable sequence &key (:from-end t) (:start index) (:end sequence-end)
616             (:key callable))
617   index
618   (foldable flushable call))
619
620 (defknown (mismatch search)
621   (sequence sequence &key (:from-end t) (:test callable) (:test-not callable)
622             (:start1 index) (:end1 sequence-end)
623             (:start2 index) (:end2 sequence-end)
624             (:key callable))
625   (or index null)
626   (foldable flushable call))
627
628 ;;; not FLUSHABLE, since vector sort guaranteed in-place...
629 (defknown (stable-sort sort) (sequence callable &key (:key callable)) sequence
630   (call)
631   :derive-type (sequence-result-nth-arg 1)
632   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
633 (defknown sb!impl::stable-sort-list (list function function) list
634   (call important-result)
635   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
636 (defknown sb!impl::sort-vector (vector index index function (or function null))
637   * ; SORT-VECTOR works through side-effect
638   (call)
639   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
640
641 (defknown merge (type-specifier sequence sequence callable
642                                 &key (:key callable))
643   sequence
644   (call important-result)
645   :derive-type (creation-result-type-specifier-nth-arg 1)
646   :destroyed-constant-args (nth-constant-nonempty-sequence-args 2 3))
647
648 ;;; not FLUSHABLE, despite what CMU CL's DEFKNOWN said..
649 (defknown read-sequence (sequence stream
650                                   &key
651                                   (:start index)
652                                   (:end sequence-end))
653   (index)
654   ())
655
656 (defknown write-sequence (sequence stream
657                                    &key
658                                    (:start index)
659                                    (:end sequence-end))
660   sequence
661   ()
662   :derive-type (sequence-result-nth-arg 1))
663 \f
664 ;;;; from the "Manipulating List Structure" chapter:
665 (defknown (car cdr first rest)
666   (list)
667   t
668   (foldable flushable))
669
670 ;; Correct argument type restrictions for these functions are
671 ;; complicated, so we just declare them to accept LISTs and suppress
672 ;; flushing is safe code.
673 (defknown (caar cadr cdar cddr
674                 caaar caadr cadar caddr cdaar cdadr cddar cdddr
675                 caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
676                 cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
677                 second third fourth fifth sixth seventh eighth ninth tenth)
678   (list)
679   t
680   (foldable unsafely-flushable))
681
682 (defknown cons (t t) cons (movable flushable unsafe))
683
684 (defknown tree-equal (t t &key (:test callable) (:test-not callable)) boolean
685   (foldable flushable call))
686 (defknown endp (list) boolean (foldable flushable movable))
687 (defknown list-length (list) (or index null) (foldable unsafely-flushable))
688 (defknown nth (unsigned-byte list) t (foldable flushable))
689 (defknown nthcdr (unsigned-byte list) t (foldable unsafely-flushable))
690 (defknown last (list &optional unsigned-byte) t (foldable flushable))
691 (defknown sb!impl::last1 (list) t (foldable flushable))
692 (defknown list (&rest t) list (movable flushable unsafe))
693 (defknown list* (t &rest t) t (movable flushable unsafe))
694 (defknown make-list (index &key (:initial-element t)) list
695   (movable flushable unsafe))
696
697 ;;; All but last must be of type LIST, but there seems to be no way to
698 ;;; express that in this syntax.
699 (defknown append (&rest t) t (flushable))
700
701 (defknown copy-list (list) list (flushable))
702 (defknown copy-alist (list) list (flushable))
703 (defknown copy-tree (t) t (flushable recursive))
704 (defknown revappend (list t) t (flushable))
705
706 ;;; All but last must be of type LIST, but there seems to be no way to
707 ;;; express that in this syntax. The result must be LIST, but we do
708 ;;; not check it now :-).
709 (defknown nconc (&rest t) t ()
710   :destroyed-constant-args (remove-non-constants-and-nils #'butlast))
711 (defknown sb!impl::nconc2 (list t) t ()
712   :destroyed-constant-args (remove-non-constants-and-nils #'butlast))
713
714 (defknown nreconc (list t) t (important-result)
715   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
716 (defknown butlast (list &optional unsigned-byte) list (flushable))
717 (defknown nbutlast (list &optional unsigned-byte) list ()
718   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
719
720 (defknown ldiff (list t) list (flushable))
721 (defknown (rplaca rplacd) (cons t) list (unsafe)
722   :destroyed-constant-args (nth-constant-args 1))
723
724 (defknown subst (t t t &key (:key callable) (:test callable)
725                    (:test-not callable))
726   t (flushable unsafe call))
727 (defknown nsubst (t t t &key (:key callable) (:test callable)
728                     (:test-not callable))
729   t (unsafe call)
730   :destroyed-constant-args (nth-constant-nonempty-sequence-args 3))
731
732 (defknown (subst-if subst-if-not)
733           (t callable t &key (:key callable))
734   t (flushable unsafe call))
735 (defknown (nsubst-if nsubst-if-not)
736           (t callable t &key (:key callable))
737   t (unsafe call)
738   :destroyed-constant-args (nth-constant-nonempty-sequence-args 3))
739
740 (defknown sublis (list t &key (:key callable) (:test callable)
741                        (:test-not callable))
742   t (flushable unsafe call))
743 (defknown nsublis (list t &key (:key callable) (:test callable)
744                         (:test-not callable))
745   t (flushable unsafe call)
746   :destroyed-constant-args (nth-constant-nonempty-sequence-args 2))
747
748 (defknown member (t list &key (:key callable) (:test callable)
749                     (:test-not callable))
750   list (foldable flushable call))
751 (defknown (member-if member-if-not) (callable list &key (:key callable))
752   list (foldable flushable call))
753
754 (defknown tailp (t list) boolean (foldable flushable))
755
756 (defknown adjoin (t list &key (:key callable) (:test callable)
757                     (:test-not callable))
758   list (foldable flushable unsafe call))
759
760 (defknown (union intersection set-difference set-exclusive-or)
761   (list list &key (:key callable) (:test callable) (:test-not callable))
762   list
763   (foldable flushable call))
764
765 (defknown (nunion nintersection nset-difference nset-exclusive-or)
766   (list list &key (:key callable) (:test callable) (:test-not callable))
767   list
768   (foldable flushable call important-result)
769   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1 2))
770
771 (defknown subsetp
772   (list list &key (:key callable) (:test callable) (:test-not callable))
773   boolean
774   (foldable flushable call))
775
776 (defknown acons (t t t) list (movable flushable unsafe))
777 (defknown pairlis (t t &optional t) list (flushable unsafe))
778
779 (defknown (rassoc assoc)
780           (t list &key (:key callable) (:test callable) (:test-not callable))
781   list (foldable flushable call))
782 (defknown (assoc-if-not assoc-if rassoc-if rassoc-if-not)
783           (callable list &key (:key callable)) list (foldable flushable call))
784
785 (defknown (memq assq) (t list) list (foldable flushable unsafe))
786 (defknown delq (t list) list (flushable unsafe)
787   :destroyed-constant-args (nth-constant-nonempty-sequence-args 2))
788 \f
789 ;;;; from the "Hash Tables" chapter:
790
791 (defknown make-hash-table
792   (&key (:test callable) (:size unsigned-byte)
793         (:rehash-size (or (integer 1) (float (1.0))))
794         (:rehash-threshold (real 0 1))
795         (:weak-p t))
796   hash-table
797   (flushable unsafe))
798 (defknown hash-table-p (t) boolean (movable foldable flushable))
799 (defknown gethash (t hash-table &optional t) (values t boolean)
800   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
801 (defknown sb!impl::gethash2 (t hash-table) (values t boolean)
802   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
803 (defknown sb!impl::gethash3 (t hash-table t) (values t boolean)
804   (flushable unsafe)) ; not FOLDABLE, since hash table contents can change
805 (defknown %puthash (t hash-table t) t (unsafe)
806   :destroyed-constant-args (nth-constant-args 2))
807 (defknown remhash (t hash-table) boolean ()
808   :destroyed-constant-args (nth-constant-args 2))
809 (defknown maphash (callable hash-table) null (flushable call))
810 (defknown clrhash (hash-table) hash-table ()
811   :destroyed-constant-args (nth-constant-args 2))
812 (defknown hash-table-count (hash-table) index (flushable))
813 (defknown hash-table-rehash-size (hash-table) (or (integer 1) (float (1.0)))
814   (foldable flushable))
815 (defknown hash-table-rehash-threshold (hash-table) (real 0 1)
816   (foldable flushable))
817 (defknown hash-table-size (hash-table) index (flushable))
818 (defknown hash-table-test (hash-table) symbol (foldable flushable))
819 (defknown sxhash (t) (integer 0 #.sb!xc:most-positive-fixnum)
820   (#-sb-xc-host foldable flushable))
821 \f
822 ;;;; from the "Arrays" chapter
823
824 (defknown make-array ((or index list)
825                       &key
826                       (:element-type type-specifier)
827                       (:initial-element t)
828                       (:initial-contents t)
829                       (:adjustable t)
830                       (:fill-pointer t)
831                       (:displaced-to (or array null))
832                       (:displaced-index-offset index))
833   array (flushable unsafe))
834
835 (defknown vector (&rest t) simple-vector (flushable unsafe))
836
837 (defknown aref (array &rest index) t (foldable))
838 (defknown row-major-aref (array index) t (foldable))
839
840 (defknown array-element-type (array)
841   type-specifier
842   (foldable flushable recursive))
843 (defknown array-rank (array) array-rank (foldable flushable))
844 (defknown array-dimension (array array-rank) index (foldable flushable))
845 (defknown array-dimensions (array) list (foldable flushable))
846 (defknown array-in-bounds-p (array &rest integer) boolean (foldable flushable))
847 (defknown array-row-major-index (array &rest index) array-total-size
848   (foldable flushable))
849 (defknown array-total-size (array) array-total-size (foldable flushable))
850 (defknown adjustable-array-p (array) boolean (movable foldable flushable))
851
852 (defknown svref (simple-vector index) t (foldable flushable))
853 (defknown bit ((array bit) &rest index) bit (foldable flushable))
854 (defknown sbit ((simple-array bit) &rest index) bit (foldable flushable))
855
856 ;;; FIXME: :DESTROYED-CONSTANT-ARGS for these is complicated.
857 (defknown (bit-and bit-ior bit-xor bit-eqv bit-nand bit-nor bit-andc1 bit-andc2
858                    bit-orc1 bit-orc2)
859   ((array bit) (array bit) &optional (or (array bit) (member t nil)))
860   (array bit)
861   ()
862   #|:derive-type #'result-type-last-arg|#)
863
864 (defknown bit-not ((array bit) &optional (or (array bit) (member t nil)))
865   (array bit)
866   ()
867   #|:derive-type #'result-type-last-arg|#)
868
869 (defknown bit-vector-= (bit-vector bit-vector) boolean
870   (movable foldable flushable))
871
872 (defknown array-has-fill-pointer-p (array) boolean
873   (movable foldable flushable))
874 (defknown fill-pointer (vector) index (foldable unsafely-flushable))
875 (defknown vector-push (t vector) (or index null) ()
876   :destroyed-constant-args (nth-constant-args 2))
877 (defknown vector-push-extend (t vector &optional index) index ()
878   :destroyed-constant-args (nth-constant-args 2))
879 (defknown vector-pop (vector) t ()
880   :destroyed-constant-args (nth-constant-args 1))
881
882 ;;; FIXME: complicated :DESTROYED-CONSTANT-ARGS
883 ;;; Also, an important-result warning could be provided if the array
884 ;;; is known to be not expressly adjustable.
885 (defknown adjust-array
886   (array (or index list) &key (:element-type type-specifier)
887          (:initial-element t) (:initial-contents t)
888          (:fill-pointer t) (:displaced-to (or array null))
889          (:displaced-index-offset index))
890   array (unsafe))
891 ;  :derive-type 'result-type-arg1) Not even close...
892 \f
893 ;;;; from the "Strings" chapter:
894
895 (defknown char (string index) character (foldable flushable))
896 (defknown schar (simple-string index) character (foldable flushable))
897
898 (defknown (string= string-equal)
899   (string-designator string-designator &key (:start1 index) (:end1 sequence-end)
900               (:start2 index) (:end2 sequence-end))
901   boolean
902   (foldable flushable))
903
904 (defknown (string< string> string<= string>= string/= string-lessp
905                    string-greaterp string-not-lessp string-not-greaterp
906                    string-not-equal)
907   (string-designator string-designator &key (:start1 index) (:end1 sequence-end)
908               (:start2 index) (:end2 sequence-end))
909   (or index null)
910   (foldable flushable))
911
912 (defknown make-string (index &key (:element-type type-specifier)
913                        (:initial-element character))
914   simple-string (flushable))
915
916 (defknown (string-trim string-left-trim string-right-trim)
917   (sequence string-designator) simple-string (flushable))
918
919 (defknown (string-upcase string-downcase string-capitalize)
920   (string-designator &key (:start index) (:end sequence-end))
921   simple-string (flushable))
922
923 (defknown (nstring-upcase nstring-downcase nstring-capitalize)
924   (string &key (:start index) (:end sequence-end))
925   string ()
926   :destroyed-constant-args (nth-constant-nonempty-sequence-args 1))
927
928 (defknown string (string-designator) string
929   (flushable explicit-check))
930 \f
931 ;;;; internal non-keyword versions of string predicates:
932
933 (defknown (string<* string>* string<=* string>=* string/=*)
934   (string-designator string-designator index sequence-end index sequence-end)
935   (or index null)
936   (foldable flushable))
937
938 (defknown string=*
939   (string-designator string-designator index sequence-end index sequence-end)
940   boolean
941   (foldable flushable))
942 \f
943 ;;;; from the "Eval" chapter:
944
945 (defknown eval (t) * (recursive))
946 (defknown constantp (t &optional lexenv-designator) boolean
947   (foldable flushable))
948 \f
949 ;;;; from the "Streams" chapter:
950
951 (defknown make-synonym-stream (symbol) stream (flushable))
952 (defknown make-broadcast-stream (&rest stream) stream (unsafely-flushable))
953 (defknown make-concatenated-stream (&rest stream) stream (unsafely-flushable))
954 (defknown make-two-way-stream (stream stream) stream (unsafely-flushable))
955 (defknown make-echo-stream (stream stream) stream (flushable))
956 (defknown make-string-input-stream (string &optional index sequence-end)
957   stream
958   (flushable unsafe))
959 (defknown make-string-output-stream
960     (&key (:element-type type-specifier))
961     stream
962   (flushable))
963 (defknown get-output-stream-string (stream) simple-string ())
964 (defknown streamp (t) boolean (movable foldable flushable))
965 (defknown stream-element-type (stream) type-specifier
966   (movable foldable flushable))
967 (defknown (output-stream-p input-stream-p) (stream) boolean
968   (movable foldable flushable))
969 (defknown close (stream &key (:abort t)) (eql t) ())
970 \f
971 ;;;; from the "Input/Output" chapter:
972
973 ;;; (The I/O functions are given effects ANY under the theory that
974 ;;; code motion over I/O operations is particularly confusing and not
975 ;;; very important for efficiency.)
976
977 (defknown copy-readtable (&optional (or readtable null) (or readtable null))
978   readtable
979   ())
980 (defknown readtablep (t) boolean (movable foldable flushable))
981
982 (defknown set-syntax-from-char
983   (character character &optional (or readtable null) readtable) (eql t)
984   ())
985
986 (defknown set-macro-character (character callable &optional t readtable)
987   (eql t)
988   (unsafe))
989 (defknown get-macro-character (character &optional (or readtable null))
990   (values callable boolean) (flushable))
991
992 (defknown make-dispatch-macro-character (character &optional t readtable)
993   (eql t) ())
994 (defknown set-dispatch-macro-character
995   (character character callable &optional readtable) function
996   (unsafe))
997 (defknown get-dispatch-macro-character
998   (character character &optional (or readtable null)) (or callable null)
999   ())
1000
1001 (defknown copy-pprint-dispatch
1002   (&optional (or sb!pretty:pprint-dispatch-table null))
1003   sb!pretty:pprint-dispatch-table
1004   ())
1005 (defknown pprint-dispatch
1006   (t &optional (or sb!pretty:pprint-dispatch-table null))
1007   (values callable boolean)
1008   ())
1009 (defknown (pprint-fill pprint-linear)
1010   (stream-designator t &optional t t)
1011   null
1012   ())
1013 (defknown pprint-tabular
1014   (stream-designator t &optional t t unsigned-byte)
1015   null
1016   ())
1017 (defknown pprint-indent
1018   ((member :block :current) real &optional stream-designator)
1019   null
1020   ())
1021 (defknown pprint-newline
1022   ((member :linear :fill :miser :mandatory) &optional stream-designator)
1023   null
1024   ())
1025 (defknown pprint-tab
1026   ((member :line :section :line-relative :section-relative)
1027    unsigned-byte unsigned-byte &optional stream-designator)
1028   null
1029   ())
1030 (defknown set-pprint-dispatch
1031   (type-specifier (or null callable)
1032    &optional real sb!pretty:pprint-dispatch-table)
1033   null
1034   ())
1035
1036 ;;; may return any type due to eof-value...
1037 (defknown (read read-preserving-whitespace read-char-no-hang read-char)
1038   (&optional stream-designator t t t) t (explicit-check))
1039
1040 (defknown read-delimited-list (character &optional stream-designator t) list
1041   (explicit-check))
1042 (defknown read-line (&optional stream-designator t t t) (values t boolean)
1043   (explicit-check))
1044 (defknown unread-char (character &optional stream-designator) t
1045   (explicit-check))
1046 (defknown peek-char (&optional (or character (member nil t))
1047                                stream-designator t t t)
1048   t
1049   (explicit-check))
1050 (defknown listen (&optional stream-designator) boolean (flushable explicit-check))
1051
1052 (defknown clear-input (&optional stream-designator) null (explicit-check))
1053
1054 (defknown read-from-string
1055   (string &optional t t
1056           &key
1057           (:start index)
1058           (:end sequence-end)
1059           (:preserve-whitespace t))
1060   (values t index))
1061 (defknown parse-integer
1062   (string &key
1063           (:start index)
1064           (:end sequence-end)
1065           (:radix (integer 2 36))
1066           (:junk-allowed t))
1067   (values (or integer null ()) index))
1068
1069 (defknown read-byte (stream &optional t t) t (explicit-check))
1070
1071 (defknown write
1072   (t &key
1073      (:stream stream-designator)
1074      (:escape t)
1075      (:radix t)
1076      (:base (integer 2 36))
1077      (:circle t)
1078      (:pretty t)
1079      (:level (or unsigned-byte null))
1080      (:readably t)
1081      (:length (or unsigned-byte null))
1082      (:case t)
1083      (:array t)
1084      (:gensym t)
1085      (:lines (or unsigned-byte null))
1086      (:right-margin (or unsigned-byte null))
1087      (:miser-width (or unsigned-byte null))
1088      (:pprint-dispatch t))
1089   t
1090   (any explicit-check)
1091   :derive-type #'result-type-first-arg)
1092
1093 (defknown (prin1 print princ) (t &optional stream-designator)
1094   t
1095   (any explicit-check)
1096   :derive-type #'result-type-first-arg)
1097
1098 ;;; xxx-TO-STRING functions are not foldable because they depend on
1099 ;;; the dynamic environment, the state of the pretty printer dispatch
1100 ;;; table, and probably other run-time factors.
1101 (defknown write-to-string
1102   (t &key (:escape t) (:radix t) (:base (integer 2 36)) (:readably t)
1103      (:circle t) (:pretty t) (:level (or unsigned-byte null))
1104      (:length (or unsigned-byte null)) (:case t) (:array t) (:gensym t)
1105      (:lines (or unsigned-byte null)) (:right-margin (or unsigned-byte null))
1106      (:miser-width (or unsigned-byte null)) (:pprint-dispatch t))
1107   simple-string
1108   (flushable explicit-check))
1109
1110 (defknown (prin1-to-string princ-to-string) (t) simple-string (flushable))
1111
1112 (defknown write-char (character &optional stream-designator) character
1113   (explicit-check))
1114 (defknown (write-string write-line)
1115   (string &optional stream-designator &key (:start index) (:end sequence-end))
1116   string
1117   (explicit-check))
1118
1119 (defknown (terpri finish-output force-output clear-output)
1120   (&optional stream-designator) null
1121   (explicit-check))
1122
1123 (defknown fresh-line (&optional stream-designator) boolean
1124   (explicit-check))
1125
1126 (defknown write-byte (integer stream) integer
1127   (explicit-check))
1128
1129 ;;; FIXME: complicated :DESTROYED-CONSTANT-ARGS
1130 (defknown format ((or (member nil t) stream string)
1131                   (or string function) &rest t)
1132   (or string null)
1133   (explicit-check))
1134
1135 (defknown (y-or-n-p yes-or-no-p) (&optional string &rest t) boolean
1136   (explicit-check))
1137 \f
1138 ;;;; from the "File System Interface" chapter:
1139
1140 ;;; (No pathname functions are FOLDABLE because they all potentially
1141 ;;; depend on *DEFAULT-PATHNAME-DEFAULTS*, e.g. to provide a default
1142 ;;; host when parsing a namestring. They are not FLUSHABLE because
1143 ;;; parsing of a PATHNAME-DESIGNATOR might signal an error.)
1144
1145 (defknown wild-pathname-p (pathname-designator
1146                            &optional
1147                            (member nil :host :device
1148                                    :directory :name
1149                                    :type :version))
1150   generalized-boolean
1151   ())
1152 (defknown pathname-match-p (pathname-designator pathname-designator)
1153   generalized-boolean
1154   ())
1155 (defknown translate-pathname (pathname-designator
1156                               pathname-designator
1157                               pathname-designator &key)
1158   pathname
1159   ())
1160
1161 (defknown logical-pathname (pathname-designator) logical-pathname ())
1162 (defknown translate-logical-pathname (pathname-designator &key) pathname
1163   (recursive))
1164 (defknown load-logical-pathname-translations (string) t ())
1165 (defknown logical-pathname-translations (logical-host-designator) list ())
1166
1167 (defknown pathname (pathname-designator) pathname (unsafely-flushable))
1168 (defknown truename (pathname-designator) pathname ())
1169
1170 (defknown parse-namestring
1171   (pathname-designator &optional
1172                        (or list host string (member :unspecific))
1173                        pathname-designator
1174                        &key
1175                        (:start index)
1176                        (:end sequence-end)
1177                        (:junk-allowed t))
1178   (values (or pathname null) sequence-end)
1179   ())
1180
1181 (defknown merge-pathnames
1182   (pathname-designator &optional pathname-designator pathname-version)
1183   pathname
1184   (unsafely-flushable))
1185
1186 (defknown make-pathname
1187  (&key (:defaults pathname-designator)
1188        (:host (or string pathname-host))
1189        (:device (or string pathname-device))
1190        (:directory (or pathname-directory string (member :wild)))
1191        (:name (or pathname-name string (member :wild)))
1192        (:type (or pathname-type string (member :wild)))
1193        (:version pathname-version) (:case (member :local :common)))
1194   pathname (unsafely-flushable))
1195
1196 (defknown pathnamep (t) boolean (movable flushable))
1197
1198 (defknown pathname-host (pathname-designator
1199                          &key (:case (member :local :common)))
1200   pathname-host (flushable))
1201 (defknown pathname-device (pathname-designator
1202                            &key (:case (member :local :common)))
1203   pathname-device (flushable))
1204 (defknown pathname-directory (pathname-designator
1205                               &key (:case (member :local :common)))
1206   pathname-directory (flushable))
1207 (defknown pathname-name (pathname-designator
1208                          &key (:case (member :local :common)))
1209   pathname-name (flushable))
1210 (defknown pathname-type (pathname-designator
1211                          &key (:case (member :local :common)))
1212   pathname-type (flushable))
1213 (defknown pathname-version (pathname-designator)
1214   pathname-version (flushable))
1215
1216 (defknown (namestring file-namestring directory-namestring host-namestring)
1217   (pathname-designator) (or simple-string null)
1218   (unsafely-flushable))
1219
1220 (defknown enough-namestring (pathname-designator &optional pathname-designator)
1221   simple-string
1222   (unsafely-flushable))
1223
1224 (defknown user-homedir-pathname (&optional t) pathname (flushable))
1225
1226 (defknown open
1227   (pathname-designator &key
1228                        (:direction (member :input :output :io :probe))
1229                        (:element-type type-specifier)
1230                        (:if-exists (member :error :new-version :rename
1231                                            :rename-and-delete :overwrite
1232                                            :append :supersede nil))
1233                        (:if-does-not-exist (member :error :create nil))
1234                        (:external-format keyword))
1235   (or stream null))
1236
1237 (defknown rename-file (pathname-designator filename)
1238   (values pathname pathname pathname))
1239 (defknown delete-file (pathname-designator) t)
1240 (defknown probe-file (pathname-designator) (or pathname null) ())
1241 (defknown file-write-date (pathname-designator) (or unsigned-byte null)
1242   ())
1243 (defknown file-author (pathname-designator) (or simple-string null)
1244   ())
1245
1246 (defknown file-position (stream &optional
1247                                 (or unsigned-byte (member :start :end)))
1248   (or unsigned-byte (member t nil)))
1249 (defknown file-length (stream) (or unsigned-byte null) (unsafely-flushable))
1250
1251 (defknown load
1252   ((or filename stream)
1253    &key
1254    (:verbose t)
1255    (:print t)
1256    (:if-does-not-exist (member :error :create nil))
1257    (:external-format keyword))
1258   t)
1259
1260 (defknown directory (pathname-designator &key)
1261   list ())
1262 \f
1263 ;;;; from the "Conditions" chapter:
1264
1265 (defknown cell-error-name (cell-error) t)
1266 (defknown error (t &rest t) nil)
1267 (defknown cerror (format-control t &rest t) null)
1268 (defknown invalid-method-error (t format-control &rest t) *) ; FIXME: first arg is METHOD
1269 (defknown method-combination-error (format-control &rest t) *)
1270 (defknown signal (t &rest t) null)
1271 (defknown simple-condition-format-control (condition)
1272   format-control)
1273 (defknown simple-condition-format-arguments (condition)
1274   list)
1275 (defknown warn (t &rest t) null)
1276 (defknown invoke-debugger (condition) nil)
1277 (defknown break (&optional format-control &rest t) null)
1278 (defknown make-condition (type-specifier &rest t) condition)
1279 (defknown compute-restarts (&optional (or condition null)) list)
1280 (defknown find-restart (restart-designator &optional (or condition null))
1281   (or restart null))
1282 (defknown invoke-restart (restart-designator &rest t) *)
1283 (defknown invoke-restart-interactively (restart-designator) *)
1284 (defknown restart-name (restart) symbol)
1285 (defknown (abort muffle-warning) (&optional (or condition null)) nil)
1286 (defknown continue (&optional (or condition null)) null)
1287 (defknown (store-value use-value) (t &optional (or condition null))
1288   null)
1289
1290 ;;; and analogous SBCL extension:
1291 (defknown bug (t &rest t) nil) ; never returns
1292 \f
1293 ;;;; from the "Miscellaneous" Chapter:
1294
1295 (defknown compile ((or symbol cons) &optional (or list function null))
1296   (values (or function symbol cons) boolean boolean))
1297
1298 (defknown compile-file
1299   (pathname-designator
1300    &key
1301
1302    ;; ANSI options
1303    (:output-file (or pathname-designator
1304                      null
1305                      ;; FIXME: This last case is a non-ANSI hack.
1306                      (member t)))
1307    (:verbose t)
1308    (:print t)
1309    (:external-format keyword)
1310
1311    ;; extensions
1312    (:trace-file t)
1313    (:block-compile t))
1314   (values (or pathname null) boolean boolean))
1315
1316 ;; FIXME: consider making (OR CALLABLE CONS) something like
1317 ;; EXTENDED-FUNCTION-DESIGNATOR
1318 (defknown disassemble ((or callable cons) &key
1319                        (:stream stream) (:use-labels t))
1320   null)
1321
1322 (defknown fdocumentation (t symbol)
1323   (or string null)
1324   (flushable))
1325
1326 (defknown describe (t &optional (or stream (member t nil))) (values))
1327 (defknown inspect (t) (values))
1328 (defknown room (&optional (member t nil :default)) (values))
1329 (defknown ed (&optional (or symbol cons filename))
1330   t)
1331 (defknown dribble (&optional filename &key (:if-exists t)) (values))
1332
1333 (defknown apropos      (string-designator &optional package-designator t) (values))
1334 (defknown apropos-list (string-designator &optional package-designator t) list
1335   (flushable))
1336
1337 (defknown get-decoded-time ()
1338   (values (integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1339           (integer 1 12) unsigned-byte (integer 0 6) boolean (rational -24 24))
1340   (flushable))
1341
1342 (defknown get-universal-time () unsigned-byte (flushable))
1343
1344 (defknown decode-universal-time
1345           (unsigned-byte &optional (or null (rational -24 24)))
1346   (values (integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1347           (integer 1 12) unsigned-byte (integer 0 6) boolean (rational -24 24))
1348   (flushable))
1349
1350 (defknown encode-universal-time
1351   ((integer 0 59) (integer 0 59) (integer 0 23) (integer 1 31)
1352    (integer 1 12) unsigned-byte &optional (or null (rational -24 24)))
1353   unsigned-byte
1354   (flushable))
1355
1356 (defknown (get-internal-run-time get-internal-real-time)
1357   () internal-time (flushable))
1358
1359 (defknown sleep ((or (rational 0) (float 0.0))) null)
1360
1361 ;;; Even though ANSI defines LISP-IMPLEMENTATION-TYPE and
1362 ;;; LISP-IMPLEMENTATION-VERSION to possibly punt and return NIL, we
1363 ;;; know that there's no valid reason for our implementations to ever
1364 ;;; do so, so we can safely guarantee that they'll return strings.
1365 (defknown (lisp-implementation-type lisp-implementation-version)
1366   () simple-string (flushable))
1367
1368 ;;; For any of these functions, meaningful information might not be
1369 ;;; available, so -- unlike the related LISP-IMPLEMENTATION-FOO
1370 ;;; functions -- these really can return NIL.
1371 (defknown (machine-type machine-version machine-instance
1372            software-type software-version
1373            short-site-name long-site-name)
1374   () (or simple-string null) (flushable))
1375
1376 (defknown identity (t) t (movable foldable flushable unsafe)
1377   :derive-type #'result-type-first-arg)
1378
1379 (defknown constantly (t) function (movable flushable))
1380 (defknown complement (function) function (movable flushable))
1381 \f
1382 ;;;; miscellaneous extensions
1383
1384 (defknown get-bytes-consed () unsigned-byte (flushable))
1385 (defknown mask-signed-field ((integer 0 *) integer) integer
1386           (movable flushable foldable))
1387
1388 ;;; PCOUNTERs
1389 (defknown incf-pcounter (pcounter unsigned-byte) pcounter)
1390 (defknown pcounter->integer (pcounter) unsigned-byte)
1391 (defknown %incf-pcounter-or-fixnum ((or pcounter fixnum) unsigned-byte)
1392   (or pcounter fixnum))
1393 (defknown pcounter-or-fixnum->integer ((or pcounter fixnum)) unsigned-byte)
1394 \f
1395 ;;;; magical compiler frobs
1396
1397 ;;; We can't fold this in general because of SATISFIES. There is a
1398 ;;; special optimizer anyway.
1399 (defknown %typep (t (or type-specifier ctype)) boolean
1400   (movable flushable explicit-check))
1401 (defknown %instance-typep (t (or type-specifier ctype)) boolean
1402   (movable flushable explicit-check))
1403
1404 (defknown %cleanup-point () t)
1405 (defknown %special-bind (t t) t)
1406 (defknown %special-unbind (t) t)
1407 (defknown %listify-rest-args (t index) list (flushable))
1408 (defknown %more-arg-context (t t) (values t index) (flushable))
1409 (defknown %more-arg (t index) t)
1410 (defknown %more-arg-values (t index index) * (flushable))
1411 (defknown %verify-arg-count (index index) (values))
1412 (defknown %arg-count-error (t) nil)
1413 (defknown %unknown-values () *)
1414 (defknown %catch (t t) t)
1415 (defknown %unwind-protect (t t) t)
1416 (defknown (%catch-breakup %unwind-protect-breakup) () t)
1417 (defknown %lexical-exit-breakup (t) t)
1418 (defknown %continue-unwind (t t t) nil)
1419 (defknown %throw (t &rest t) nil) ; This is MV-called.
1420 (defknown %nlx-entry (t) *)
1421 (defknown %%primitive (t t &rest t) *)
1422 (defknown %pop-values (t) t)
1423 (defknown %nip-values (t t &rest t) (values))
1424 (defknown %allocate-closures (t) *)
1425 (defknown %type-check-error (t t) nil)
1426
1427 ;; FIXME: This function does not return, but due to the implementation
1428 ;; of FILTER-LVAR we cannot write it here.
1429 (defknown %compile-time-type-error (t t t) *)
1430
1431 (defknown %odd-key-args-error () nil)
1432 (defknown %unknown-key-arg-error (t) nil)
1433 (defknown (%ldb %mask-field) (bit-index bit-index integer) unsigned-byte
1434   (movable foldable flushable explicit-check))
1435 (defknown (%dpb %deposit-field) (integer bit-index bit-index integer) integer
1436   (movable foldable flushable explicit-check))
1437 (defknown %negate (number) number (movable foldable flushable explicit-check))
1438 (defknown %check-bound (array index fixnum) index (movable foldable flushable))
1439 (defknown data-vector-ref (simple-array index) t
1440   (foldable explicit-check))
1441 (defknown data-vector-set (array index t) t (unsafe explicit-check))
1442 (defknown hairy-data-vector-ref (array index) t
1443   (foldable explicit-check))
1444 (defknown hairy-data-vector-set (array index t) t (unsafe explicit-check))
1445 (defknown %caller-frame-and-pc () (values t t) (flushable))
1446 (defknown %with-array-data (array index (or index null))
1447   (values (simple-array * (*)) index index index)
1448   (foldable flushable))
1449 (defknown %set-symbol-package (symbol t) t (unsafe))
1450 (defknown %coerce-name-to-fun ((or symbol cons)) function (flushable))
1451 (defknown %coerce-callable-to-fun (callable) function (flushable))
1452 (defknown failed-%with-array-data (t t t) nil)
1453 (defknown %find-position
1454   (t sequence t index sequence-end function function)
1455   (values t (or index null))
1456   (flushable call))
1457 (defknown (%find-position-if %find-position-if-not)
1458   (function sequence t index sequence-end function)
1459   (values t (or index null))
1460   (call))
1461 (defknown effective-find-position-test (callable callable)
1462   function
1463   (flushable foldable))
1464 (defknown effective-find-position-key (callable)
1465   function
1466   (flushable foldable))
1467
1468 (defknown %check-vector-sequence-bounds (vector index sequence-end)
1469   index
1470   (unwind))
1471 ;;; FIXME: including this information here is probably necessary to
1472 ;;; get efficient compilation of the inline expansion of
1473 ;;; %FIND-POSITION-IF, so it should maybe be in a more
1474 ;;; compiler-friendly package (SB-INT?)
1475 (defknown sb!impl::signal-bounding-indices-bad-error
1476     (sequence index sequence-end)
1477   nil) ; never returns
1478
1479
1480 (defknown arg-count-error (t t t t t t) nil (unsafe))
1481 \f
1482 ;;;; SETF inverses
1483
1484 (defknown %aset (array &rest t) t (unsafe)
1485   :destroyed-constant-args (nth-constant-args 1))
1486 (defknown %set-row-major-aref (array index t) t (unsafe)
1487   :destroyed-constant-args (nth-constant-args 1))
1488 (defknown (%rplaca %rplacd) (cons t) t (unsafe)
1489   :destroyed-constant-args (nth-constant-args 1))
1490 (defknown %put (symbol t t) t (unsafe))
1491 (defknown %setelt (sequence index t) t (unsafe)
1492   :destroyed-constant-args (nth-constant-args 1))
1493 (defknown %svset (simple-vector index t) t (unsafe)
1494   :destroyed-constant-args (nth-constant-args 1))
1495 (defknown %bitset ((array bit) &rest index) bit (unsafe)
1496   :destroyed-constant-args (nth-constant-args 1))
1497 (defknown %sbitset ((simple-array bit) &rest index) bit (unsafe)
1498   :destroyed-constant-args (nth-constant-args 1))
1499 (defknown %charset (string index character) character (unsafe)
1500   :destroyed-constant-args (nth-constant-args 1))
1501 (defknown %scharset (simple-string index character) character (unsafe)
1502   :destroyed-constant-args (nth-constant-args 1))
1503 (defknown %set-symbol-value (symbol t) t (unsafe))
1504 (defknown (setf symbol-function) (function symbol) function (unsafe))
1505 (defknown %set-symbol-plist (symbol t) t (unsafe))
1506 (defknown (setf fdocumentation) ((or string null) t symbol)
1507   (or string null)
1508   ())
1509 (defknown %setnth (unsigned-byte list t) t (unsafe)
1510   :destroyed-constant-args (nth-constant-args 2))
1511 (defknown %set-fill-pointer (vector index) index (unsafe)
1512   :destroyed-constant-args (nth-constant-args 1))
1513 \f
1514 ;;;; ALIEN and call-out-to-C stuff
1515
1516 ;;; 'unsafe' attribute because we store the arg on the stack, which is in
1517 ;;; some sense 'passing it upwards'
1518 (defknown sb!vm::push-word-on-c-stack (system-area-pointer) (values) (unsafe))
1519 (defknown sb!vm::pop-words-from-c-stack (index) (values) ())
1520
1521 #!+linkage-table
1522 (defknown foreign-symbol-dataref-sap (simple-string)
1523   system-area-pointer
1524   (movable flushable))
1525
1526 (defknown foreign-symbol-sap (simple-string &optional boolean)
1527   system-area-pointer
1528   (movable flushable))
1529
1530 (defknown foreign-symbol-address (simple-string &optional boolean)
1531   (values integer boolean)
1532   (movable flushable))
1533
1534 ;;;; miscellaneous internal utilities
1535
1536 (defknown %fun-name (function) t (flushable))
1537 (defknown (setf %fun-name) (t function) t (unsafe))
1538
1539 (defknown policy-quality (policy symbol) policy-quality
1540           (flushable))
1541
1542 (defknown (compiler-abort compiler-error) (string &rest t) nil ())
1543 (defknown (compiler-warn compiler-style-warn) (string &rest t) (values) ())
1544 (defknown (compiler-notify maybe-compiler-notify) ((or string symbol) &rest t)
1545   (values)
1546   ())
1547 (defknown style-warn (string &rest t) null ())
1548