(macrolet ((def (name result access src-type &optional typep)
`(defun ,name (object ,@(if typep '(type) ()))
+ (declare (type ,(ecase src-type
+ (:list 'list)
+ (:vector 'vector)
+ (:sequence 'sequence)) object))
(do* ((index 0 (1+ index))
- (length (length (the ,(ecase src-type
- (:list 'list)
- (:vector 'vector)
- (:sequence 'sequence))
- object)))
+ (length (length object))
(result ,result)
(in-object object))
- ((= index length) result)
+ ((>= index length) result)
(declare (fixnum length index))
+ (declare (type vector result))
(setf (,access result index)
,(ecase src-type
(:list '(pop in-object))
aref :sequence t))
(defun vector-to-list* (object)
+ (declare (type vector object))
(let ((result (list nil))
(length (length object)))
(declare (fixnum length))
(do ((index 0 (1+ index))
(splice result (cdr splice)))
- ((= index length) (cdr result))
+ ((>= index length) (cdr result))
(declare (fixnum index))
(rplacd splice (list (aref object index))))))
;; FIXME: If we go to a compiler-only implementation, this can
;; become COMPILE instead of EVAL, which seems nicer to me.
(eval `(function ,object)))
- ((instance-lambda)
- (deprecation-warning 'instance-lambda 'lambda)
- (eval `(function ,object)))
(t
(error 'simple-type-error
:datum object