(in-package "SB!IMPL")
-(file-comment
- "$Header$")
-
-(macrolet ((def-frob (name result access src-type &optional typep)
+(macrolet ((def (name result access src-type &optional typep)
`(defun ,name (object ,@(if typep '(type) ()))
(do* ((index 0 (1+ index))
(length (length (the ,(ecase src-type
(:list '(pop in-object))
(:vector '(aref in-object index))))))))
- (def-frob list-to-simple-string* (make-string length) schar :list)
+ (def list-to-simple-string* (make-string length) schar :list)
- (def-frob list-to-bit-vector* (make-array length :element-type '(mod 2))
+ (def list-to-bit-vector* (make-array length :element-type '(mod 2))
sbit :list)
- (def-frob list-to-vector* (make-sequence-of-type type length)
+ (def list-to-vector* (make-sequence-of-type type length)
aref :list t)
- (def-frob vector-to-vector* (make-sequence-of-type type length)
+ (def vector-to-vector* (make-sequence-of-type type length)
aref :vector t)
- (def-frob vector-to-simple-string* (make-string length) schar :vector)
+ (def vector-to-simple-string* (make-string length) schar :vector)
- (def-frob vector-to-bit-vector* (make-array length :element-type '(mod 2))
+ (def vector-to-bit-vector* (make-array length :element-type '(mod 2))
sbit :vector))
(defun vector-to-list* (object)
;;; DEFTRANSFORMs, though.
(declaim (inline coerce-to-list))
(declaim (inline coerce-to-simple-string coerce-to-bit-vector coerce-to-vector))
-(defun coerce-to-function (object)
+(defun coerce-to-fun (object)
;; (Unlike the other COERCE-TO-FOOs, this one isn't inline, because
;; it's so big and because optimizing away the outer ETYPECASE
;; doesn't seem to buy us that much anyway.)
(etypecase object
(list (list-to-bit-vector* object))
(vector (vector-to-bit-vector* object))))
+(defun coerce-to-simple-vector (x)
+ (if (simple-vector-p x)
+ x
+ (replace (make-array (length x)) x)))
(defun coerce-to-vector (object output-type-spec)
(etypecase object
(list (list-to-vector* object output-type-spec))
;;; old working version
(defun coerce (object output-type-spec)
#!+sb-doc
- "Coerces the Object to an object of type Output-Type-Spec."
+ "Coerce the Object to an object of type Output-Type-Spec."
(flet ((coerce-error ()
(/show0 "entering COERCE-ERROR")
(error 'simple-type-error
:format-control "~S can't be converted to type ~S."
:format-arguments (list object output-type-spec)))
(check-result (result)
- #!+high-security
- (check-type-var result output-type-spec)
+ #!+high-security (aver (typep result output-type-spec))
result))
(let ((type (specifier-type output-type-spec)))
(cond
(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)))
:format-control "~S can't be converted to type ~S."
:format-arguments (list object output-type-spec)))
(check-result (result)
- #!+high-security
- (check-type-var result output-type-spec)
+ #!+high-security (aver (typep result output-type-spec))
result))
(let ((type (specifier-type output-type-spec)))
(cond
((csubtypep type (specifier-type 'character))
(character object))
((csubtypep type (specifier-type 'function))
- (coerce-to-function object))
+ (coerce-to-fun object))
((numberp object)
(let ((res
(cond