1b395f1830bda6c792b813412e607f5eb1e038dc
[sbcl.git] / src / code / early-type.lisp
1 ;;;; This software is part of the SBCL system. See the README file for
2 ;;;; more information.
3 ;;;;
4 ;;;; This software is derived from the CMU CL system, which was
5 ;;;; written at Carnegie Mellon University and released into the
6 ;;;; public domain. The software is in the public domain and is
7 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
8 ;;;; files for more information.
9
10 (in-package "SB!KERNEL")
11
12 (!begin-collecting-cold-init-forms)
13
14 ;;;; representations of types
15
16 ;;; A HAIRY-TYPE represents anything too weird to be described
17 ;;; reasonably or to be useful, such as NOT, SATISFIES, unknown types,
18 ;;; and unreasonably complicated types involving AND. We just remember
19 ;;; the original type spec.
20 (defstruct (hairy-type (:include ctype
21                                  (class-info (type-class-or-lose 'hairy))
22                                  (enumerable t)
23                                  (might-contain-other-types-p t))
24                        (:copier nil)
25                        #!+cmu (:pure nil))
26   ;; the Common Lisp type-specifier of the type we represent
27   (specifier nil :type t))
28
29 (!define-type-class hairy)
30
31 ;;; An UNKNOWN-TYPE is a type not known to the type system (not yet
32 ;;; defined). We make this distinction since we don't want to complain
33 ;;; about types that are hairy but defined.
34 (defstruct (unknown-type (:include hairy-type)
35                          (:copier nil)))
36
37 (defun maybe-reparse-specifier (type)
38   (when (unknown-type-p type)
39     (let* ((spec (unknown-type-specifier type))
40            (name (if (consp spec)
41                      (car spec)
42                      spec)))
43       (when (info :type :kind name)
44         (let ((new-type (specifier-type spec)))
45           (unless (unknown-type-p new-type)
46             new-type))))))
47
48 ;;; Evil macro.
49 (defmacro maybe-reparse-specifier! (type)
50   (assert (symbolp type))
51   (with-unique-names (new-type)
52     `(let ((,new-type (maybe-reparse-specifier ,type)))
53        (when ,new-type
54          (setf ,type ,new-type)
55          t))))
56
57 (defstruct (negation-type (:include ctype
58                                     (class-info (type-class-or-lose 'negation))
59                                     ;; FIXME: is this right?  It's
60                                     ;; what they had before, anyway
61                                     (enumerable t)
62                                     (might-contain-other-types-p t))
63                           (:copier nil)
64                           #!+cmu (:pure nil))
65   (type (missing-arg) :type ctype))
66
67 (!define-type-class negation)
68
69 ;;; ARGS-TYPE objects are used both to represent VALUES types and
70 ;;; to represent FUNCTION types.
71 (defstruct (args-type (:include ctype)
72                       (:constructor nil)
73                       (:copier nil))
74   ;; Lists of the type for each required and optional argument.
75   (required nil :type list)
76   (optional nil :type list)
77   ;; The type for the rest arg. NIL if there is no &REST arg.
78   (rest nil :type (or ctype null))
79   ;; true if &KEY arguments are specified
80   (keyp nil :type boolean)
81   ;; list of KEY-INFO structures describing the &KEY arguments
82   (keywords nil :type list)
83   ;; true if other &KEY arguments are allowed
84   (allowp nil :type boolean))
85
86 (defun canonicalize-args-type-args (required optional rest &optional keyp)
87   (when (eq rest *empty-type*)
88     ;; or vice-versa?
89     (setq rest nil))
90   (loop with last-not-rest = nil
91         for i from 0
92         for opt in optional
93         do (cond ((eq opt *empty-type*)
94                   (return (values required (subseq optional i) rest)))
95                  ((and (not keyp) (neq opt rest))
96                   (setq last-not-rest i)))
97         finally (return (values required
98                                 (cond (keyp
99                                        optional)
100                                       (last-not-rest
101                                        (subseq optional 0 (1+ last-not-rest))))
102                                 rest))))
103
104 (defun parse-args-types (lambda-list-like-thing)
105   (multiple-value-bind
106         (required optional restp rest keyp keys allowp auxp aux
107                   morep more-context more-count llk-p)
108       (parse-lambda-list-like-thing lambda-list-like-thing :silent t)
109     (declare (ignore aux morep more-context more-count))
110     (when auxp
111       (error "&AUX in a FUNCTION or VALUES type: ~S." lambda-list-like-thing))
112     (let ((required (mapcar #'single-value-specifier-type required))
113           (optional (mapcar #'single-value-specifier-type optional))
114           (rest (when restp (single-value-specifier-type rest)))
115           (keywords
116            (collect ((key-info))
117              (dolist (key keys)
118                (unless (proper-list-of-length-p key 2)
119                  (error "Keyword type description is not a two-list: ~S." key))
120                (let ((kwd (first key)))
121                  (when (find kwd (key-info) :key #'key-info-name)
122                    (error "~@<repeated keyword ~S in lambda list: ~2I~_~S~:>"
123                           kwd lambda-list-like-thing))
124                  (key-info
125                   (make-key-info
126                    :name kwd
127                    :type (single-value-specifier-type (second key))))))
128              (key-info))))
129       (multiple-value-bind (required optional rest)
130           (canonicalize-args-type-args required optional rest keyp)
131         (values required optional rest keyp keywords allowp llk-p)))))
132
133 (defstruct (values-type
134             (:include args-type
135                       (class-info (type-class-or-lose 'values)))
136             (:constructor %make-values-type)
137             (:predicate %values-type-p)
138             (:copier nil)))
139
140 (declaim (inline value-type-p))
141 (defun values-type-p (x)
142   (or (eq x *wild-type*)
143       (%values-type-p x)))
144
145 (defun-cached (make-values-type-cached
146                :hash-bits 8
147                :hash-function (lambda (req opt rest allowp)
148                                 (logand (logxor
149                                          (type-list-cache-hash req)
150                                          (type-list-cache-hash opt)
151                                          (if rest
152                                              (type-hash-value rest)
153                                              42)
154                                          (sxhash allowp))
155                                         #xFF)))
156     ((required equal-but-no-car-recursion)
157      (optional equal-but-no-car-recursion)
158      (rest eq)
159      (allowp eq))
160   (%make-values-type :required required
161                      :optional optional
162                      :rest rest
163                      :allowp allowp))
164
165 (defun make-values-type (&key required optional rest allowp)
166   (multiple-value-bind (required optional rest)
167       (canonicalize-args-type-args required optional rest)
168     (cond ((and (null required)
169                 (null optional)
170                 (eq rest *universal-type*))
171            *wild-type*)
172           ((memq *empty-type* required)
173            *empty-type*)
174           (t (make-values-type-cached required optional
175                                       rest allowp)))))
176
177 (!define-type-class values)
178
179 ;;; (SPECIFIER-TYPE 'FUNCTION) and its subtypes
180 (defstruct (fun-type (:include args-type
181                                (class-info (type-class-or-lose 'function)))
182                      (:constructor
183                       make-fun-type (&key required optional rest
184                                           keyp keywords allowp
185                                           wild-args
186                                           returns
187                                      &aux (rest (if (eq rest *empty-type*)
188                                                     nil
189                                                     rest)))))
190   ;; true if the arguments are unrestrictive, i.e. *
191   (wild-args nil :type boolean)
192   ;; type describing the return values. This is a values type
193   ;; when multiple values were specified for the return.
194   (returns (missing-arg) :type ctype))
195
196 ;;; The CONSTANT-TYPE structure represents a use of the CONSTANT-ARG
197 ;;; "type specifier", which is only meaningful in function argument
198 ;;; type specifiers used within the compiler. (It represents something
199 ;;; that the compiler knows to be a constant.)
200 (defstruct (constant-type
201             (:include ctype
202                       (class-info (type-class-or-lose 'constant)))
203             (:copier nil))
204   ;; The type which the argument must be a constant instance of for this type
205   ;; specifier to win.
206   (type (missing-arg) :type ctype))
207
208 ;;; The NAMED-TYPE is used to represent *, T and NIL, the standard
209 ;;; special cases, as well as other special cases needed to
210 ;;; interpolate between regions of the type hierarchy, such as
211 ;;; INSTANCE (which corresponds to all those classes with slots which
212 ;;; are not funcallable), FUNCALLABLE-INSTANCE (those classes with
213 ;;; slots which are funcallable) and EXTENDED-SEQUUENCE (non-LIST
214 ;;; non-VECTOR classes which are also sequences).  These special cases
215 ;;; are the ones that aren't really discussed by Baker in his
216 ;;; "Decision Procedure for SUBTYPEP" paper.
217 (defstruct (named-type (:include ctype
218                                  (class-info (type-class-or-lose 'named)))
219                        (:copier nil))
220   (name nil :type symbol))
221
222 ;;; a list of all the float "formats" (i.e. internal representations;
223 ;;; nothing to do with #'FORMAT), in order of decreasing precision
224 (eval-when (:compile-toplevel :load-toplevel :execute)
225   (defparameter *float-formats*
226     '(long-float double-float single-float short-float)))
227
228 ;;; The type of a float format.
229 (deftype float-format () `(member ,@*float-formats*))
230
231 ;;; A NUMERIC-TYPE represents any numeric type, including things
232 ;;; such as FIXNUM.
233 (defstruct (numeric-type (:include ctype
234                                    (class-info (type-class-or-lose 'number)))
235                          (:constructor %make-numeric-type)
236                          (:copier nil))
237   ;; the kind of numeric type we have, or NIL if not specified (just
238   ;; NUMBER or COMPLEX)
239   ;;
240   ;; KLUDGE: A slot named CLASS for a non-CLASS value is bad.
241   ;; Especially when a CLASS value *is* stored in another slot (called
242   ;; CLASS-INFO:-). Perhaps this should be called CLASS-NAME? Also
243   ;; weird that comment above says "Numeric-Type is used to represent
244   ;; all numeric types" but this slot doesn't allow COMPLEX as an
245   ;; option.. how does this fall into "not specified" NIL case above?
246   ;; Perhaps someday we can switch to CLOS and make NUMERIC-TYPE
247   ;; be an abstract base class and INTEGER-TYPE, RATIONAL-TYPE, and
248   ;; whatnot be concrete subclasses..
249   (class nil :type (member integer rational float nil) :read-only t)
250   ;; "format" for a float type (i.e. type specifier for a CPU
251   ;; representation of floating point, e.g. 'SINGLE-FLOAT -- nothing
252   ;; to do with #'FORMAT), or NIL if not specified or not a float.
253   ;; Formats which don't exist in a given implementation don't appear
254   ;; here.
255   (format nil :type (or float-format null) :read-only t)
256   ;; Is this a complex numeric type?  Null if unknown (only in NUMBER).
257   ;;
258   ;; FIXME: I'm bewildered by FOO-P names for things not intended to
259   ;; interpreted as truth values. Perhaps rename this COMPLEXNESS?
260   (complexp :real :type (member :real :complex nil) :read-only t)
261   ;; The upper and lower bounds on the value, or NIL if there is no
262   ;; bound. If a list of a number, the bound is exclusive. Integer
263   ;; types never have exclusive bounds, i.e. they may have them on
264   ;; input, but they're canonicalized to inclusive bounds before we
265   ;; store them here.
266   (low nil :type (or number cons null) :read-only t)
267   (high nil :type (or number cons null) :read-only t))
268
269 ;;; Impose canonicalization rules for NUMERIC-TYPE. Note that in some
270 ;;; cases, despite the name, we return *EMPTY-TYPE* instead of a
271 ;;; NUMERIC-TYPE.
272 (defun make-numeric-type (&key class format (complexp :real) low high
273                                enumerable)
274   ;; if interval is empty
275   (if (and low
276            high
277            (if (or (consp low) (consp high)) ; if either bound is exclusive
278                (>= (type-bound-number low) (type-bound-number high))
279                (> low high)))
280       *empty-type*
281       (multiple-value-bind (canonical-low canonical-high)
282           (case class
283             (integer
284              ;; INTEGER types always have their LOW and HIGH bounds
285              ;; represented as inclusive, not exclusive values.
286              (values (if (consp low)
287                          (1+ (type-bound-number low))
288                          low)
289                      (if (consp high)
290                          (1- (type-bound-number high))
291                          high)))
292             (t
293              ;; no canonicalization necessary
294              (values low high)))
295         (when (and (eq class 'rational)
296                    (integerp canonical-low)
297                    (integerp canonical-high)
298                    (= canonical-low canonical-high))
299           (setf class 'integer))
300         (%make-numeric-type :class class
301                             :format format
302                             :complexp complexp
303                             :low canonical-low
304                             :high canonical-high
305                             :enumerable enumerable))))
306
307 (defun modified-numeric-type (base
308                               &key
309                               (class      (numeric-type-class      base))
310                               (format     (numeric-type-format     base))
311                               (complexp   (numeric-type-complexp   base))
312                               (low        (numeric-type-low        base))
313                               (high       (numeric-type-high       base))
314                               (enumerable (numeric-type-enumerable base)))
315   (make-numeric-type :class class
316                      :format format
317                      :complexp complexp
318                      :low low
319                      :high high
320                      :enumerable enumerable))
321
322 (defstruct (character-set-type
323             (:include ctype
324                       (class-info (type-class-or-lose 'character-set)))
325             (:constructor %make-character-set-type)
326             (:copier nil))
327   (pairs (missing-arg) :type list :read-only t))
328 (defun make-character-set-type (&key pairs)
329   ; (aver (equal (mapcar #'car pairs)
330   ;              (sort (mapcar #'car pairs) #'<)))
331   ;; aver that the cars of the list elements are sorted into increasing order
332   (aver (or (null pairs)
333             (do ((p pairs (cdr p)))
334                 ((null (cdr p)) t)
335               (when (> (caar p) (caadr p)) (return nil)))))
336   (let ((pairs (let (result)
337                 (do ((pairs pairs (cdr pairs)))
338                     ((null pairs) (nreverse result))
339                   (destructuring-bind (low . high) (car pairs)
340                     (loop for (low1 . high1) in (cdr pairs)
341                           if (<= low1 (1+ high))
342                           do (progn (setf high (max high high1))
343                                     (setf pairs (cdr pairs)))
344                           else do (return nil))
345                     (cond
346                       ((>= low sb!xc:char-code-limit))
347                       ((< high 0))
348                       (t (push (cons (max 0 low)
349                                      (min high (1- sb!xc:char-code-limit)))
350                                result))))))))
351     (if (null pairs)
352        *empty-type*
353        (%make-character-set-type :pairs pairs))))
354
355 ;;; An ARRAY-TYPE is used to represent any array type, including
356 ;;; things such as SIMPLE-BASE-STRING.
357 (defstruct (array-type (:include ctype
358                                  (class-info (type-class-or-lose 'array)))
359                        (:constructor %make-array-type)
360                        (:copier nil))
361   ;; the dimensions of the array, or * if unspecified. If a dimension
362   ;; is unspecified, it is *.
363   (dimensions '* :type (or list (member *)))
364   ;; Is this not a simple array type? (:MAYBE means that we don't know.)
365   (complexp :maybe :type (member t nil :maybe))
366   ;; the element type as originally specified
367   (element-type (missing-arg) :type ctype)
368   ;; the element type as it is specialized in this implementation
369   (specialized-element-type *wild-type* :type ctype))
370 (define-cached-synonym make-array-type)
371
372 ;;; A MEMBER-TYPE represent a use of the MEMBER type specifier. We
373 ;;; bother with this at this level because MEMBER types are fairly
374 ;;; important and union and intersection are well defined.
375 (defstruct (member-type (:include ctype
376                                   (class-info (type-class-or-lose 'member))
377                                   (enumerable t))
378                         (:copier nil)
379                         (:constructor %make-member-type (xset fp-zeroes))
380                         #-sb-xc-host (:pure nil))
381   (xset (missing-arg) :type xset)
382   (fp-zeroes (missing-arg) :type list))
383 (defun make-member-type (&key xset fp-zeroes members)
384   (unless xset
385     (aver (not fp-zeroes))
386     (setf xset (alloc-xset))
387     (dolist (elt members)
388       (if (fp-zero-p elt)
389           (pushnew elt fp-zeroes)
390           (add-to-xset elt xset))))
391   ;; if we have a pair of zeros (e.g. 0.0d0 and -0.0d0), then we can
392   ;; canonicalize to (DOUBLE-FLOAT 0.0d0 0.0d0), because numeric
393   ;; ranges are compared by arithmetic operators (while MEMBERship is
394   ;; compared by EQL).  -- CSR, 2003-04-23
395   (let ((unpaired nil)
396         (union-types nil))
397     (do ((tail (cdr fp-zeroes) (cdr tail))
398          (zero (car fp-zeroes) (car tail)))
399         ((not zero))
400       (macrolet ((frob (c)
401                    `(let ((neg (neg-fp-zero zero)))
402                       (if (member neg tail)
403                           (push (ctype-of ,c) union-types)
404                           (push zero unpaired)))))
405         (etypecase zero
406           (single-float (frob 0.0f0))
407           (double-float (frob 0.0d0))
408           #!+long-float
409           (long-float (frob 0.0l0)))))
410     ;; The actual member-type contains the XSET (with no FP zeroes),
411     ;; and a list of unpaired zeroes.
412     (let ((member-type (unless (and (xset-empty-p xset) (not unpaired))
413                          (%make-member-type xset unpaired))))
414       (cond (union-types
415              (make-union-type t (if member-type
416                                     (cons member-type union-types)
417                                     union-types)))
418             (member-type
419              member-type)
420             (t
421              *empty-type*)))))
422
423 (defun member-type-size (type)
424   (+ (length (member-type-fp-zeroes type))
425      (xset-count (member-type-xset type))))
426
427 (defun member-type-member-p (x type)
428   (if (fp-zero-p x)
429       (and (member x (member-type-fp-zeroes type)) t)
430       (xset-member-p x (member-type-xset type))))
431
432 (defun mapcar-member-type-members (function type)
433   (declare (function function))
434   (collect ((results))
435     (map-xset (lambda (x)
436                 (results (funcall function x)))
437               (member-type-xset type))
438     (dolist (zero (member-type-fp-zeroes type))
439       (results (funcall function zero)))
440     (results)))
441
442 (defun mapc-member-type-members (function type)
443   (declare (function function))
444   (map-xset function (member-type-xset type))
445   (dolist (zero (member-type-fp-zeroes type))
446     (funcall function zero)))
447
448 (defun member-type-members (type)
449   (append (member-type-fp-zeroes type)
450           (xset-members (member-type-xset type))))
451
452 ;;; A COMPOUND-TYPE is a type defined out of a set of types, the
453 ;;; common parent of UNION-TYPE and INTERSECTION-TYPE.
454 (defstruct (compound-type (:include ctype
455                                     (might-contain-other-types-p t))
456                           (:constructor nil)
457                           (:copier nil))
458   (types nil :type list :read-only t))
459
460 ;;; A UNION-TYPE represents a use of the OR type specifier which we
461 ;;; couldn't canonicalize to something simpler. Canonical form:
462 ;;;   1. All possible pairwise simplifications (using the UNION2 type
463 ;;;      methods) have been performed. Thus e.g. there is never more
464 ;;;      than one MEMBER-TYPE component. FIXME: As of sbcl-0.6.11.13,
465 ;;;      this hadn't been fully implemented yet.
466 ;;;   2. There are never any UNION-TYPE components.
467 (defstruct (union-type (:include compound-type
468                                  (class-info (type-class-or-lose 'union)))
469                        (:constructor %make-union-type (enumerable types))
470                        (:copier nil)))
471 (define-cached-synonym make-union-type)
472
473 ;;; An INTERSECTION-TYPE represents a use of the AND type specifier
474 ;;; which we couldn't canonicalize to something simpler. Canonical form:
475 ;;;   1. All possible pairwise simplifications (using the INTERSECTION2
476 ;;;      type methods) have been performed. Thus e.g. there is never more
477 ;;;      than one MEMBER-TYPE component.
478 ;;;   2. There are never any INTERSECTION-TYPE components: we've
479 ;;;      flattened everything into a single INTERSECTION-TYPE object.
480 ;;;   3. There are never any UNION-TYPE components. Either we should
481 ;;;      use the distributive rule to rearrange things so that
482 ;;;      unions contain intersections and not vice versa, or we
483 ;;;      should just punt to using a HAIRY-TYPE.
484 (defstruct (intersection-type (:include compound-type
485                                         (class-info (type-class-or-lose
486                                                      'intersection)))
487                               (:constructor %make-intersection-type
488                                             (enumerable types))
489                               (:copier nil)))
490
491 ;;; Return TYPE converted to canonical form for a situation where the
492 ;;; "type" '* (which SBCL still represents as a type even though ANSI
493 ;;; CL defines it as a related but different kind of placeholder) is
494 ;;; equivalent to type T.
495 (defun type-*-to-t (type)
496   (if (type= type *wild-type*)
497       *universal-type*
498       type))
499
500 ;;; A CONS-TYPE is used to represent a CONS type.
501 (defstruct (cons-type (:include ctype (class-info (type-class-or-lose 'cons)))
502                       (:constructor
503                        %make-cons-type (car-type
504                                         cdr-type))
505                       (:copier nil))
506   ;; the CAR and CDR element types (to support ANSI (CONS FOO BAR) types)
507   ;;
508   ;; FIXME: Most or all other type structure slots could also be :READ-ONLY.
509   (car-type (missing-arg) :type ctype :read-only t)
510   (cdr-type (missing-arg) :type ctype :read-only t))
511 (defun make-cons-type (car-type cdr-type)
512   (aver (not (or (eq car-type *wild-type*)
513                  (eq cdr-type *wild-type*))))
514   (if (or (eq car-type *empty-type*)
515           (eq cdr-type *empty-type*))
516       *empty-type*
517       (%make-cons-type car-type cdr-type)))
518
519 (defun cons-type-length-info (type)
520   (declare (type cons-type type))
521   (do ((min 1 (1+ min))
522        (cdr (cons-type-cdr-type type) (cons-type-cdr-type cdr)))
523       ((not (cons-type-p cdr))
524        (cond
525          ((csubtypep cdr (specifier-type 'null))
526           (values min t))
527          ((csubtypep *universal-type* cdr)
528           (values min nil))
529          ((type/= (type-intersection (specifier-type 'cons) cdr) *empty-type*)
530           (values min nil))
531          ((type/= (type-intersection (specifier-type 'null) cdr) *empty-type*)
532           (values min t))
533          (t (values min :maybe))))
534     ()))
535
536 \f
537 ;;;; type utilities
538
539 ;;; Return the type structure corresponding to a type specifier. We
540 ;;; pick off structure types as a special case.
541 ;;;
542 ;;; Note: VALUES-SPECIFIER-TYPE-CACHE-CLEAR must be called whenever a
543 ;;; type is defined (or redefined).
544 (defun-cached (values-specifier-type
545                :hash-function (lambda (x)
546                                 (logand (sxhash x) #x3FF))
547                :hash-bits 10
548                :init-wrapper !cold-init-forms)
549               ((orig equal-but-no-car-recursion))
550   (let ((u (uncross orig)))
551     (or (info :type :builtin u)
552         (let ((spec (typexpand u)))
553           (cond
554            ((and (not (eq spec u))
555                  (info :type :builtin spec)))
556            ((and (consp spec) (symbolp (car spec))
557                  (info :type :builtin (car spec))
558                  (let ((expander (info :type :expander (car spec))))
559                    (and expander (values-specifier-type (funcall expander spec))))))
560            ((eq (info :type :kind spec) :instance)
561             (find-classoid spec))
562            ((typep spec 'classoid)
563             (if (typep spec 'built-in-classoid)
564                 (or (built-in-classoid-translation spec) spec)
565                 spec))
566            (t
567             (when (and (atom spec)
568                        (member spec '(and or not member eql satisfies values)))
569               (error "The symbol ~S is not valid as a type specifier." spec))
570             (let* ((lspec (if (atom spec) (list spec) spec))
571                    (fun (info :type :translator (car lspec))))
572               (cond (fun
573                      (funcall fun lspec))
574                     ((or (and (consp spec) (symbolp (car spec))
575                               (not (info :type :builtin (car spec))))
576                          (and (symbolp spec) (not (info :type :builtin spec))))
577                      (when (and *type-system-initialized*
578                                 (not (eq (info :type :kind spec)
579                                          :forthcoming-defclass-type)))
580                        (signal 'parse-unknown-type :specifier spec))
581                      ;; (The RETURN-FROM here inhibits caching; this
582                      ;; does not only make sense from a compiler
583                      ;; diagnostics point of view but is also
584                      ;; indispensable for proper workingness of
585                      ;; VALID-TYPE-SPECIFIER-P.)
586                      (return-from values-specifier-type
587                        (make-unknown-type :specifier spec)))
588                     (t
589                      (error "bad thing to be a type specifier: ~S"
590                             spec))))))))))
591
592 ;;; This is like VALUES-SPECIFIER-TYPE, except that we guarantee to
593 ;;; never return a VALUES type.
594 (defun specifier-type (x)
595   (let ((res (values-specifier-type x)))
596     (when (or (values-type-p res)
597               ;; bootstrap magic :-(
598               (and (named-type-p res)
599                    (eq (named-type-name res) '*)))
600       (error "VALUES type illegal in this context:~%  ~S" x))
601     res))
602
603 (defun single-value-specifier-type (x)
604   (if (eq x '*)
605       *universal-type*
606       (specifier-type x)))
607
608 (defun typexpand-1 (type-specifier &optional env)
609   #!+sb-doc
610   "Takes and expands a type specifier once like MACROEXPAND-1.
611 Returns two values: the expansion, and a boolean that is true when
612 expansion happened."
613   (declare (type type-specifier type-specifier))
614   (declare (ignore env))
615   (multiple-value-bind (expander lspec)
616       (let ((spec type-specifier))
617         (cond ((and (symbolp spec) (info :type :builtin spec))
618                ;; We do not expand builtins even though it'd be
619                ;; possible to do so sometimes (e.g. STRING) for two
620                ;; reasons:
621                ;;
622                ;; a) From a user's point of view, CL types are opaque.
623                ;;
624                ;; b) so (EQUAL (TYPEXPAND 'STRING) (TYPEXPAND-ALL 'STRING))
625                (values nil nil))
626               ((symbolp spec)
627                (values (info :type :expander spec) (list spec)))
628               ((and (consp spec) (symbolp (car spec)) (info :type :builtin (car spec)))
629                ;; see above
630                (values nil nil))
631               ((and (consp spec) (symbolp (car spec)))
632                (values (info :type :expander (car spec)) spec))
633               (t nil)))
634     (if expander
635         (values (funcall expander lspec) t)
636         (values type-specifier nil))))
637
638 (defun typexpand (type-specifier &optional env)
639   #!+sb-doc
640   "Takes and expands a type specifier repeatedly like MACROEXPAND.
641 Returns two values: the expansion, and a boolean that is true when
642 expansion happened."
643   (declare (type type-specifier type-specifier))
644   (multiple-value-bind (expansion flag)
645       (typexpand-1 type-specifier env)
646     (if flag
647         (values (typexpand expansion env) t)
648         (values expansion flag))))
649
650 (defun typexpand-all (type-specifier &optional env)
651   #!+sb-doc
652   "Takes and expands a type specifier recursively like MACROEXPAND-ALL."
653   (declare (type type-specifier type-specifier))
654   (declare (ignore env))
655   ;; I first thought this would not be a good implementation because
656   ;; it signals an error on e.g. (CONS 1 2) until I realized that
657   ;; walking and calling TYPEXPAND would also result in errors, and
658   ;; it actually makes sense.
659   ;;
660   ;; There's still a small problem in that
661   ;;   (TYPEXPAND-ALL '(CONS * FIXNUM)) => (CONS T FIXNUM)
662   ;; whereas walking+typexpand would result in (CONS * FIXNUM).
663   ;;
664   ;; Similiarly, (TYPEXPAND-ALL '(FUNCTION (&REST T) *)) => FUNCTION.
665   (type-specifier (values-specifier-type type-specifier)))
666
667 (defun defined-type-name-p (name &optional env)
668   #!+sb-doc
669   "Returns T if NAME is known to name a type specifier, otherwise NIL."
670   (declare (symbol name))
671   (declare (ignore env))
672   (and (info :type :kind name) t))
673
674 (defun valid-type-specifier-p (type-specifier &optional env)
675   #!+sb-doc
676   "Returns T if TYPE-SPECIFIER is a valid type specifier, otherwise NIL.
677
678 There may be different metrics on what constitutes a \"valid type
679 specifier\" depending on context. If this function does not suit your
680 exact need, you may be able to craft a particular solution using a
681 combination of DEFINED-TYPE-NAME-P and the TYPEXPAND functions.
682
683 The definition of \"valid type specifier\" employed by this function
684 is based on the following mnemonic:
685
686           \"Would TYPEP accept it as second argument?\"
687
688 Except that unlike TYPEP, this function fully supports compound
689 FUNCTION type specifiers, and the VALUES type specifier, too.
690
691 In particular, VALID-TYPE-SPECIFIER-P will return NIL if
692 TYPE-SPECIFIER is not a class, not a symbol that is known to name a
693 type specifier, and not a cons that represents a known compound type
694 specifier in a syntactically and recursively correct way.
695
696 Examples:
697
698   (valid-type-specifier-p '(cons * *))     => T
699   (valid-type-specifier-p '#:foo)          => NIL
700   (valid-type-specifier-p '(cons * #:foo)) => NIL
701   (valid-type-specifier-p '(cons 1 *)      => NIL
702
703 Experimental."
704   (declare (ignore env))
705   (handler-case (prog1 t (values-specifier-type type-specifier))
706     (parse-unknown-type () nil)
707     (error () nil)))
708
709 ;;; Note that the type NAME has been (re)defined, updating the
710 ;;; undefined warnings and VALUES-SPECIFIER-TYPE cache.
711 (defun %note-type-defined (name)
712   (declare (symbol name))
713   (note-name-defined name :type)
714   (values-specifier-type-cache-clear)
715   (values))
716
717 \f
718 (!defun-from-collected-cold-init-forms !early-type-cold-init)