(defstruct (unknown-type (:include hairy-type)
(:copier nil)))
+(defun maybe-reparse-specifier (type)
+ (when (unknown-type-p type)
+ (let* ((spec (unknown-type-specifier type))
+ (name (if (consp spec)
+ (car spec)
+ spec)))
+ (when (info :type :kind name)
+ (let ((new-type (specifier-type spec)))
+ (unless (unknown-type-p new-type)
+ new-type))))))
+
+;;; Evil macro.
+(defmacro maybe-reparse-specifier! (type)
+ (assert (symbolp type))
+ (with-unique-names (new-type)
+ `(let ((,new-type (maybe-reparse-specifier ,type)))
+ (when ,new-type
+ (setf ,type ,new-type)
+ t))))
+
(defstruct (negation-type (:include ctype
(class-info (type-class-or-lose 'negation))
;; FIXME: is this right? It's
"Takes and expands a type specifier once like MACROEXPAND-1.
Returns two values: the expansion, and a boolean that is true when
expansion happened."
- (declare (type-specifier type-specifier))
+ (declare (type type-specifier type-specifier))
(declare (ignore env))
(multiple-value-bind (expander lspec)
(let ((spec type-specifier))
"Takes and expands a type specifier repeatedly like MACROEXPAND.
Returns two values: the expansion, and a boolean that is true when
expansion happened."
- (declare (type-specifier type-specifier))
+ (declare (type type-specifier type-specifier))
(multiple-value-bind (expansion flag)
(typexpand-1 type-specifier env)
(if flag
(defun typexpand-all (type-specifier &optional env)
#!+sb-doc
"Takes and expands a type specifier recursively like MACROEXPAND-ALL."
- (declare (type-specifier type-specifier))
+ (declare (type type-specifier type-specifier))
(declare (ignore env))
;; I first thought this would not be a good implementation because
;; it signals an error on e.g. (CONS 1 2) until I realized that