[GSLL-devel] Fixing up make-grid-data for clisp (was making copy-to working in clisp+grid: fix to element-type)
Mirko Vukovic
mirko.vukovic at gmail.com
Fri Jan 4 16:47:51 UTC 2013
This is a follow up on my posted fix to copy-to. For some reason this has
triggered another
error. I do not understand how that other error is triggered. The error
and the fix are discussed
at the bottom of the email
On Fri, Jan 4, 2013 at 10:39 AM, Mirko Vukovic <mirko.vukovic at gmail.com>wrote:
> The following works in sbcl+grid:
>
> (copy-to (make-array 2 :element-type 'double-float :initial-contents
> '(1.0d0 2.0d0)) 'grid:foreign-array)
>
> But it does not work in clisp+grid.
>
> The root cause lies in the function grid/array.lisp/element-type. It uses
> `(array-element-type grid)'.
>
> But this can present a problem. Quoting hyperspec:
>
> (Because of *array* <http://26_glo_a.htm#array> *upgrading*, this *type
> specifier* <http://26_glo_t.htm#type_specifier> can in some cases denote
> a *supertype* <http://26_glo_s.htm#supertype> of the *expressed array
> element type* <http://26_glo_e.htm#expressed_array_element_type> of the *
> array*.)
>
> In CLISP, array-element-type returns `T' when passed #(1d0 2d0)
>
> It returns T even when passed a simple array:
>
> (array-element-type (make-array 2 :element-type 'double-float
> :initial-contents
> '(1.0d0 2.0d0)
> :adjustable nil
> :fill-pointer nil
> :displaced-to nil) )
>
> The proposed fix is
>
> (defmethod element-type ((grid array))
> (type-of (row-major-aref grid 0))
> #+skip(array-element-type grid))
>
> Now copy-to works in clisp as well.
>
> Mirko
>
>
> After finishing this, I recompiled afresh, and got another error that I
traced to make-grid-data and make-array
In clisp, make-array will return an array of NIL's even if the element-type
is specified as double float. In SBCL make-array
will return an array filled with 1d0.
I had to add some clisp specific code to make-grid-data in order for it to
initialize properly.
First, a helper function:
(defun default-element (element-type)
"Return a default element depending on element-type
"
(let ((a-list '((double-float . 1d0)
(symbol . T))))
(let ((match (cdr (assoc element-type a-list))))
(assert match ()
"Default element type undefined for element-type ~a"
element-type)
match)))
And second, a bit of set-up code in make-grid-data. I broke apart the
(let* statement
to provide an explicit initial element if it has not been specified already:
(defmethod make-grid-data
((type (eql 'array)) dimensions rest-spec
&key (initial-element nil initial-element-p)
(initial-contents nil initial-contents-p))
(let ((element-type (top-spec-type rest-spec)))
#+clisp
(unless (or initial-element-p
initial-contents-p)
(setf initial-element (default-element element-type)
initial-element-p t))
(let ((array ... UNCHANGED
Summary: To fix to copy-to, I modified (defmethod element-type ((grid
array))
For some unknown reason, that triggered an error in the array
initialization routine.
To fix that, I had to add code to make-grid-data, so that it fills
double-float arrays with 0d0
instead of NIL's
I will continue using this code to see if there are additional problems.
BTW, I realize that CLISP is not a preferred platform for speedy
computation, but that is what I use
on Windows, until SBCL gets officially ported to it. And in addition, it
is a nice cross-check on portability.
Mirko
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/gsll-devel/attachments/20130104/62b572e7/attachment.html>
More information about the gsll-devel
mailing list