X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fcoerce.lisp;h=98d0a2977c744edfd5d6f2136c4bbf53c8b0e4b3;hb=67d2b80e478824a46317419f076ab1f6b020f6b1;hp=dc97323ab36962f26599e52283462f9327690ab7;hpb=397b000303e15df61661d9726126ee99ee10d9c6;p=sbcl.git diff --git a/src/code/coerce.lisp b/src/code/coerce.lisp index dc97323..98d0a29 100644 --- a/src/code/coerce.lisp +++ b/src/code/coerce.lisp @@ -11,7 +11,7 @@ (in-package "SB!IMPL") -(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 @@ -27,20 +27,20 @@ (: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) @@ -81,7 +81,7 @@ ;;; 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.) @@ -166,6 +166,11 @@ (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))) @@ -270,7 +275,7 @@ ((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