[Openmcl-devel] Apparent displaced array type bug

David Steuber david at david-steuber.com
Fri Sep 23 11:50:16 UTC 2005


On Sep 23, 2005, at 5:38 AM, Gary Byers wrote:

> The type declaration on the DATA slot asserts that the value of that
> slot should be a (SIMPLE-ARRAY (MOD 129)) of two (unspecified)
> dimensions.  In OpenMCL, arrays that're explicitly displaced are not
> SIMPLE-ARRAYs; your code is trying to assign a value to a slot that is
> not of the slot's declared type, and the results of such an attempt
> are undefined.

Xof of #lisp agrees that a displaced array is not a simple array.  At 
some time in the future, SBCL will also complain about the code I 
posted.

> OpenMCL tries to signal an error when it can determine that a slot's
> type declaration is being violated by an assignment or an
> initialization.  I think that this is useful behavior (either the
> declaration's wrong or the assignment/initialization is), though
>
> (a) it would be no more or less correct to ignore this
> (b) there are ways of violating type declarations that OpenMCL
>     doesn't check for.
>
> Is the error message below unclear ?

FSVO clear it probably is.  I was confused by the popularity contest 
pitfall of SBCL and CLisp accepting defective code.  I was confused 
because I did not know that a displaced array was not a simple array 
even though the array it was displaced to is a simple array.

I learned something new today.  Sorry for the bogus bug report.  And 
thanks for the very quick response.

There is on niggling detail left that bothers me.  If you refer to the 
Lisp Paste:

http://paste.lisp.org/display/11910#2

The paste that jdz made from 0.14.3 complains "not of type 
(simple-array (integer 0 128) (* *)).  However, the recent cvs version 
of openmcl that I am using complains "not of type (simple-array (mod 
129) (* *))".

What I had not shown in my code fragment was this bit that occurs prior 
to the defclass form:

(eval-when (:compile-toplevel :load-toplevel :execute)
   (defconstant +max-iterations+ 128))

So I'm expecting a type (integer 0 128).  It doesn't seem obvious to me 
that (mod 129) is the same thing.  Is it?  If not, then there is still 
a problem, just a different one than I originally reported.

Thanks again.

> On Fri, 23 Sep 2005, David Steuber wrote:
>
>> Hi OpenMCL developers,
>>
>> Please see LispPaste:  http://paste.lisp.org/display/11910
>>
>> david at interloper:~/usr/src/apress-fractal/src
>> $ openmcl
>> Welcome to OpenMCL Version 1.0-test-050914 (DarwinPPC32)!
>> ? (load (compile-file "apress-fractal.lisp"))
>> Performing compile-time optimization.. please wait.
>> Done.
>> #P"/Users/david/usr/src/apress-fractal/src/apress-fractal.dfsl"
>> ? (time (generate-fractals-from-input-file "../sampleinput.txt"))
>>> Error in process listener(1): The value #<ARRAY 600x800 type 
>>> (UNSIGNED-BYTE
>> 8), displaced> can not be used to set the value of the slot DATA in 
>> #<MSET-MAP [-1.0 1.0 1.0 -1.0] 800x600 #x8405A0E>, because it is not 
>> of type (SIMPLE-ARRAY (MOD 129) (* *)).
>>> While executing: CCL::%MAYBE-STD-SETF-SLOT-VALUE-USING-CLASS
>>> Type :POP to abort.
>> Type :? for other options.
>> 1 > :pop
>>
>> ? (quit)
>>
>>
>> This is code that works in both SBCL 0.9.4.0 and CLisp 2.33.2 on OS X 
>> 10.3.9. The relevant portion I think is this:
>>
>> (defclass mset-map ()
>>  ((left           :type single-float       :initarg :left           
>> :reader mset-map-left)
>>   (right          :type single-float       :initarg :right          
>> :reader mset-map-right)
>>   (top            :type single-float       :initarg :top            
>> :reader mset-map-top)
>>   (bottom         :type single-float       :initarg :bottom         
>> :reader mset-map-bottom)
>>   (width          :type (integer 1 4096)   :initarg :width          
>> :reader mset-map-width)
>>   (height         :type (integer 1 4096)   :initarg :height         
>> :reader mset-map-height)
>>   (x-axis         :type simple-vector)
>>   (y-axis         :type simple-vector)
>>   (data           :type (simple-array (integer 0 #.+max-iterations+) 
>> (* *)))
>>   (data-alias     :type (simple-array (integer 0 #.+max-iterations+) 
>> *))))
>>
>> (defmethod shared-initialize :after ((o mset-map) slot-names &rest 
>> init-args)
>>  (declare (ignore slot-names init-args))
>>  (flet ((make-axis-array (len min max)
>>           (let ((my-array (make-array len)))
>>             (loop for i below len
>>                with pixelsize = (/ (- max min) len)
>>                with start = min
>>                do (setf (svref my-array i) (+ start (* i pixelsize))))
>>             my-array)))
>>    (with-slots (left right top bottom x-axis y-axis data data-alias 
>> height width) o
>>      (setf x-axis (make-axis-array width left right)
>>            y-axis (nreverse (make-axis-array height bottom top))
>>            data-alias (make-array (* height width)
>>                                   :element-type '(integer 0 
>> #.+max-iterations+)
>>                                   :initial-element 0)
>>            data (make-array (list height width)
>>                               :element-type '(integer 0 
>> #.+max-iterations+)
>>                               :displaced-to data-alias)))))
>>
>> Just in case I am wrong, the complete code is here:
>>
>> http://www.david-steuber.com/Lisp/Apress-Fractal-Contest/apress- 
>> fractal.lisp.txt
>>
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/mailman/listinfo/openmcl-devel
>>
>>
>




More information about the Openmcl-devel mailing list