X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fearly-type.lisp;h=6f341915618401c20283ddb22f05d281fa746f3a;hb=7b384da95e6a30e1434523213aeeed3a90448c78;hp=3a9a2897a9da9c7008b43cec9296039774ac2b6f;hpb=9489abab7f981b8eea2aec8a883f2eb48d4cb138;p=sbcl.git diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index 3a9a289..6f34191 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -11,10 +11,6 @@ (!begin-collecting-cold-init-forms) -;;; Has the type system been properly initialized? (I.e. is it OK to -;;; use it?) -(defvar *type-system-initialized* #+sb-xc-host nil) ; (set in cold load) - ;;;; representations of types ;;; A HAIRY-TYPE represents anything too weird to be described @@ -139,8 +135,6 @@ :rest rest :allowp allowp)) -;;; FIXME: ANSI VALUES has a short form (without lambda list -;;; keywords), which should be translated into a long one. (defun make-values-type (&key (args nil argsp) required optional rest allowp) (if argsp @@ -175,7 +169,14 @@ ;;; (SPECIFIER-TYPE 'FUNCTION) and its subtypes (defstruct (fun-type (:include args-type (class-info (type-class-or-lose 'function))) - (:constructor %make-fun-type)) + (:constructor + %make-fun-type (&key required optional rest + keyp keywords allowp + wild-args + returns + &aux (rest (if (eq rest *empty-type*) + nil + rest))))) ;; true if the arguments are unrestrictive, i.e. * (wild-args nil :type boolean) ;; type describing the return values. This is a values type @@ -330,7 +331,7 @@ :enumerable enumerable)) ;;; An ARRAY-TYPE is used to represent any array type, including -;;; things such as SIMPLE-STRING. +;;; things such as SIMPLE-BASE-STRING. (defstruct (array-type (:include ctype (class-info (type-class-or-lose 'array))) (:constructor %make-array-type) @@ -455,6 +456,24 @@ (eq cdr-type *empty-type*)) *empty-type* (%make-cons-type car-type cdr-type))) + +(defun cons-type-length-info (type) + (declare (type cons-type type)) + (do ((min 1 (1+ min)) + (cdr (cons-type-cdr-type type) (cons-type-cdr-type cdr))) + ((not (cons-type-p cdr)) + (cond + ((csubtypep cdr (specifier-type 'null)) + (values min t)) + ((csubtypep *universal-type* cdr) + (values min nil)) + ((type/= (type-intersection (specifier-type 'cons) cdr) *empty-type*) + (values min nil)) + ((type/= (type-intersection (specifier-type 'null) cdr) *empty-type*) + (values min t)) + (t (values min :maybe)))) + ())) + ;;;; type utilities @@ -487,18 +506,16 @@ (or (built-in-classoid-translation spec) spec) spec)) (t - (let* (;; FIXME: This automatic promotion of FOO-style - ;; specs to (FOO)-style specs violates the ANSI - ;; standard. Unfortunately, we can't fix the - ;; problem just by removing it, since then things - ;; downstream should break. But at some point we - ;; should fix this and the things downstream too. - (lspec (if (atom spec) (list spec) spec)) + (when (and (atom spec) + (member spec '(and or not member eql satisfies values))) + (error "The symbol ~S is not valid as a type specifier." spec)) + (let* ((lspec (if (atom spec) (list spec) spec)) (fun (info :type :translator (car lspec)))) (cond (fun (funcall fun lspec)) - ((or (and (consp spec) (symbolp (car spec))) - (symbolp spec)) + ((or (and (consp spec) (symbolp (car spec)) + (not (info :type :builtin (car spec)))) + (and (symbolp spec) (not (info :type :builtin spec)))) (when (and *type-system-initialized* (not (eq (info :type :kind spec) :forthcoming-defclass-type))) @@ -532,7 +549,7 @@ (let ((def (cond ((symbolp form) (info :type :expander form)) ((and (consp form) (symbolp (car form))) - (info :type :expander (car form))) + (info :type :expander (car form))) (t nil)))) (if def (type-expand (funcall def (if (consp form) form (list form))))