On Mon, Jun 22, 2009 at 6:40 PM, Richard M Kreuter <kreuter@progn.net> wrote:
SVREF only works on SIMPLE-VECTORS.  A SIMPLE-VECTOR is

| a vector that is not displaced to another array, has no fill pointer,
| is not expressly adjustable and is able to hold elements of any type

Your RET is a vector of SINGLE-FLOATs, not a SIMPLE-VECTOR.

Thank you... that did indeed, get me past that hump.

===========================
(declaim (ftype (function ((array single-float (3 4))
                    (vector single-float 3))
                   (vector single-float 3)) mv*))

(defun mv* (matrix vector)
  (declare (optimize (speed 3) (safety 0)))
  (let ((ret (make-array 3 :initial-element 0.0s0
                           :element-type 'single-float)))
    (loop for jj from 0 below 3
       do (setf (aref ret jj)
                (+ (aref matrix jj 3)
                   (loop for ii from 0 below 3
                      summing (* (aref vector ii)
                                 (aref matrix jj ii))))))
    ret))
===========================


Now, to beat it up until it likes a higher speed setting.  Most of the notes I get from (speed 2) (safety 0) are understandable.  But, I don't have any idea what the first one is complaining about:

; file: /private/var/tmp/tmp.3.87YzPd.lisp                                      
; in: DEFUN MV*                                                                 
;     (AREF MATRIX JJ 3)                                                        
; --> LET*                                                                      
; ==>                                                                           
;   (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX)                        
;                                                                               
; note: unable to                                                               
;   avoid runtime dispatch on array element type                                
; due to type uncertainty:                                                      
;   The first argument is a (ARRAY SINGLE-FLOAT (3 4)), not a SIMPLE-ARRAY.     

As you mentioned, a simple-array would have type uncertainty.  But, shouldn't (array single-float (3 4)) be fairly type-certain?

Thanks,
Patrick