>
> On 1/9/06, Jason F Kantz <[EMAIL PROTECTED]> wrote:
>> Here's an example of my problem:
>>
>> (defun test (a b)
>> (declare (optimize (speed 3))
>> (type fixnum a)
>> (type fixnum b))
>> (loop for x from a to b
>> do (print (* x x))))
>>
>> Is there a way to use loop without losing on type declarations like
>> this?
>
> (defun test (a b)
> (declare (optimize (speed 3) (safety 0) (debug 0))
> (type fixnum a)
> (type fixnum b))
> (loop for x fixnum from a to b
> do (print (the fixnum (* x x)))))
The problem actually lies with the counting code created by the loop
macro. Macro expanding the loop form gives ...
(BLOCK NIL
(LET ((X A) (#:G3669 B))
(DECLARE (TYPE NUMBER #:G3669) (TYPE NUMBER X))
(ANSI-LOOP::LOOP-BODY NIL
(NIL NIL
(WHEN (> X #:G3669) (GO ANSI-LOOP::END-LOOP))
-- snip --
so it seems like these number declarations interfere with the type
inferencing that should be taking place. I get several notes concerning
the counting variable in the loop body. One of which is
; (LOOP FOR X FROM A ...)
; --> BLOCK LET ANSI-LOOP::LOOP-BODY TAGBODY WHEN COND IF
; ==>
; (> X #:G0)
; Note: Unable to optimize due to type uncertainty:
; The first argument is a REAL, not a FLOAT.