This is a follow up on my posted fix to copy-to.  For some reason this has triggered another<br>error.  I do not understand how that other error is triggered.  The error and the fix are discussed <br>at the bottom of the email<br>
<br><div class="gmail_quote">On Fri, Jan 4, 2013 at 10:39 AM, Mirko Vukovic <span dir="ltr"><<a href="mailto:mirko.vukovic@gmail.com" target="_blank">mirko.vukovic@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The following works in sbcl+grid:<br><br>(copy-to (make-array 2 :element-type 'double-float :initial-contents '(1.0d0 2.0d0)) 'grid:foreign-array)<br><br>But it does not work in clisp+grid.<br><br>The root cause lies in the function grid/array.lisp/element-type.  It uses `(array-element-type grid)'. <br>

<br>But this can present a problem.  Quoting hyperspec:<br><br>(Because of <a href="http://26_glo_a.htm#array" rel="DEFINITION" target="_blank"><i>array</i></a> 
<i>upgrading</i>, this <a href="http://26_glo_t.htm#type_specifier" rel="DEFINITION" target="_blank"><i>type specifier</i></a> can in some cases denote a <a href="http://26_glo_s.htm#supertype" rel="DEFINITION" target="_blank"><i>supertype</i></a> of the <a href="http://26_glo_e.htm#expressed_array_element_type" rel="DEFINITION" target="_blank"><i>expressed 
array element type</i></a> of the <i>array</i>.) <br><br>In CLISP, array-element-type returns `T' when passed #(1d0 2d0)<br><br>It returns T even when passed a simple array:<br><br>(array-element-type (make-array 2 :element-type 'double-float :initial-contents<br>

                      '(1.0d0 2.0d0)<br>                      :adjustable nil<br>                      :fill-pointer nil<br>                      :displaced-to nil) )<br><br>The proposed fix is<br><br>(defmethod element-type ((grid array))<br>

  (type-of (row-major-aref grid 0))<br>  #+skip(array-element-type grid))<br><br>Now copy-to works in clisp as well.<span class="HOEnZb"><font color="#888888"><br><br>Mirko<br><br><br>
</font></span></blockquote></div>After finishing this, I recompiled afresh, and got another error that I traced to make-grid-data and make-array<br><br>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<br>
will return an array filled with 1d0.<br><br>I had to add some clisp specific code to make-grid-data in order for it to initialize properly.<br><br>First, a helper function:<br>(defun default-element (element-type)<br>   "Return a default element depending on element-type<br>
"<br>   (let ((a-list '((double-float . 1d0)<br>           (symbol . T))))<br>     (let ((match (cdr (assoc element-type a-list))))<br>       (assert match ()<br>           "Default element type undefined for element-type ~a"<br>
           element-type)<br>       match)))<br><br>And second, a bit of set-up code in make-grid-data.  I broke apart the (let* statement<br>to provide an explicit initial element if it has not been specified already:<br>
<br>(defmethod make-grid-data<br>  ((type (eql 'array)) dimensions rest-spec<br>   &key (initial-element nil initial-element-p)<br>   (initial-contents nil initial-contents-p))<br>  (let ((element-type (top-spec-type rest-spec)))<br>
    #+clisp<br>    (unless (or initial-element-p<br>        initial-contents-p)<br>      (setf initial-element (default-element element-type)<br>        initial-element-p t))<br>    (let ((array ... UNCHANGED<br><br><br>Summary:  To fix to copy-to, I modified (defmethod element-type ((grid array))<br>
For some unknown reason, that triggered an error in the array initialization routine.<br>To fix that, I had to add code to make-grid-data, so that it fills double-float arrays with 0d0<br>instead of NIL's<br><br>I will continue using this code to see if there are additional problems.  <br>
<br>BTW, I realize that CLISP is not a preferred platform for speedy computation, but that is what I use<br>on Windows, until SBCL gets officially ported to it.  And in addition, it is a nice cross-check on portability.<br>
<br>Mirko<br><br><br>