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