- ((%typep object output-type-spec)
- object)
- ((eq type *empty-type*)
- (coerce-error))
- ((csubtypep type (specifier-type 'character))
- (character object))
- ((csubtypep type (specifier-type 'function))
- (when (and (legal-fun-name-p object)
- (not (fboundp object)))
- (error 'simple-type-error
- :datum object
- ;; FIXME: SATISFIES FBOUNDP is a kinda bizarre broken
- ;; type specifier, since the set of values it describes
- ;; isn't in general constant in time. Maybe we could
- ;; find a better way of expressing this error? (Maybe
- ;; with the UNDEFINED-FUNCTION condition?)
- :expected-type '(satisfies fboundp)
- :format-control "~S isn't fbound."
- :format-arguments (list object)))
- (when (and (symbolp object)
- (sb!xc:macro-function object))
- (error 'simple-type-error
- :datum object
- :expected-type '(not (satisfies sb!xc:macro-function))
- :format-control "~S is a macro."
- :format-arguments (list object)))
- (when (and (symbolp object)
- (special-operator-p object))
- (error 'simple-type-error
- :datum object
- :expected-type '(not (satisfies special-operator-p))
- :format-control "~S is a special operator."
- :format-arguments (list object)))
- (eval `#',object))
- ((numberp object)
- (cond
- ((csubtypep type (specifier-type 'single-float))
- (let ((res (%single-float object)))
- (unless (typep res output-type-spec)
- (coerce-error))
- res))
- ((csubtypep type (specifier-type 'double-float))
- (let ((res (%double-float object)))
- (unless (typep res output-type-spec)
- (coerce-error))
- res))
- #!+long-float
- ((csubtypep type (specifier-type 'long-float))
- (let ((res (%long-float object)))
- (unless (typep res output-type-spec)
- (coerce-error))
- res))
- ((csubtypep type (specifier-type 'float))
- (let ((res (%single-float object)))
- (unless (typep res output-type-spec)
- (coerce-error))
- res))
- (t
- (let ((res
- (cond
- ((csubtypep type (specifier-type '(complex single-float)))
- (complex (%single-float (realpart object))
- (%single-float (imagpart object))))
- ((csubtypep type (specifier-type '(complex double-float)))
- (complex (%double-float (realpart object))
- (%double-float (imagpart object))))
- #!+long-float
- ((csubtypep type (specifier-type '(complex long-float)))
- (complex (%long-float (realpart object))
- (%long-float (imagpart object))))
+ ((%typep object output-type-spec)
+ object)
+ ((eq type *empty-type*)
+ (coerce-error))
+ ((csubtypep type (specifier-type 'character))
+ (character object))
+ ((csubtypep type (specifier-type 'function))
+ (when (and (legal-fun-name-p object)
+ (not (fboundp object)))
+ (error 'simple-type-error
+ :datum object
+ ;; FIXME: SATISFIES FBOUNDP is a kinda bizarre broken
+ ;; type specifier, since the set of values it describes
+ ;; isn't in general constant in time. Maybe we could
+ ;; find a better way of expressing this error? (Maybe
+ ;; with the UNDEFINED-FUNCTION condition?)
+ :expected-type '(satisfies fboundp)
+ :format-control "~S isn't fbound."
+ :format-arguments (list object)))
+ (when (and (symbolp object)
+ (sb!xc:macro-function object))
+ (error 'simple-type-error
+ :datum object
+ :expected-type '(not (satisfies sb!xc:macro-function))
+ :format-control "~S is a macro."
+ :format-arguments (list object)))
+ (when (and (symbolp object)
+ (special-operator-p object))
+ (error 'simple-type-error
+ :datum object
+ :expected-type '(not (satisfies special-operator-p))
+ :format-control "~S is a special operator."
+ :format-arguments (list object)))
+ (eval `#',object))
+ ((numberp object)
+ (cond
+ ((csubtypep type (specifier-type 'single-float))
+ (let ((res (%single-float object)))
+ (unless (typep res output-type-spec)
+ (coerce-error))
+ res))
+ ((csubtypep type (specifier-type 'double-float))
+ (let ((res (%double-float object)))
+ (unless (typep res output-type-spec)
+ (coerce-error))
+ res))
+ #!+long-float
+ ((csubtypep type (specifier-type 'long-float))
+ (let ((res (%long-float object)))
+ (unless (typep res output-type-spec)
+ (coerce-error))
+ res))
+ ((csubtypep type (specifier-type 'float))
+ (let ((res (%single-float object)))
+ (unless (typep res output-type-spec)
+ (coerce-error))
+ res))
+ (t
+ (let ((res
+ (cond
+ ((csubtypep type (specifier-type '(complex single-float)))
+ (complex (%single-float (realpart object))
+ (%single-float (imagpart object))))
+ ((csubtypep type (specifier-type '(complex double-float)))
+ (complex (%double-float (realpart object))
+ (%double-float (imagpart object))))
+ #!+long-float
+ ((csubtypep type (specifier-type '(complex long-float)))
+ (complex (%long-float (realpart object))
+ (%long-float (imagpart object))))