[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problems with arrays in Franz



Hard to believe but it was less than two and a half years ago that
someone was having trouble using Franz arrays...

    Date: 17 Jul 1981 17:06:22-PDT
    From: CSVAX.jkf at Berkeley
    To: FININ@WHARTON-10
    cc: franz-friends at MIT-MC
    Subject: Re: ... the maclisp-style array package.
    In-reply-to: Your message of 17 Jul 1981 1347-PDT (Friday).

        From: FININ@WHARTON-10
        Subject: ... the maclisp-style array package.

        ...
        [3] We've been having problems with the MacLisp compatable array
            package - it doesn't work!  Does anyone have a debugged version?

    Can you be more specific? We use it in Vax Macsyma without any problems.
    Personally I feel that Maclisp arrays were invented by a madman and no new
    code should be written using them.  

    -- john foderaro

Well, I used the Maclisp array package because I didn't want to waste
time writing my own.  Instead I spent hours looking for the bug in this
code:

    -> (let ((factorial (*array () () 100.)))
            (store (factorial 0) 1)
	    (do ((i 1 (1+ i)))
	        ((= i 100.))
                (store (factorial i) (times i (factorial (1- i)))))
            (factorial 10.))
    285656

To make a long story short, this lossage is because the second argument
to *array being nil tells the garbage collector not to scan the
array.  The factorial of ten gets tossed in the bit bucket, where it
unfortunately looks like a fixnum.  To fix the example, change the
first line of the example to

    -> (let ((factorial (*array () t 100.)))

To save someone else from excruciatingly wrong answers, change the
documentation in Section 2.

    (*array 's_name 's_type 'x_dim1 ... 'x_dimn)
    (array s_name s_type x_dim1 ... x_dimn)

         WHERE:   s_type may be one of t, nil,  fixnum,  flonum,
                  fixnum-block and flonum-block.
           ...
<                  In FRANZ LISP arrays of type t, nil, fix-
<          num and flonum are equivalent and the elements of
<          these  arrays  can  be  any  type of lisp object.
---
>                  In  FRANZ  LISP arrays of type t, fixnum,
>          and  flonum  are  equivalent  and the elements of
>          these arrays can  be  any  type  of  lisp object.
>          Type nil arrays may also contain any type of lisp
>          object,  but  they are not marked  by the garbage
>          collector  (see 9.2.2)  and can lose data if used
>          incorrectly.
           Fixnum-block and  flonum-block  arrays  are  res-
           tricted  to  fixnums and flonums respectively and
           are used mainly to communicate with foreign func-
           tions (see 8.4).

Dan