OK the latest commit in master now has the following feature:
#'make-marray will optionally take a :cl-array argument. This should be a CL array generated by #'make-ffa, with the same element type as specified in the first argument to make-marray. The symbol 'make-ffa is exported for users.
Be cautious here. There are things you can do that could mess things up - changing the contents of the CL array from outside the marray object, sending the same CL array to two different marrays, etc.
Liam
On Tue, Feb 10, 2009 at 10:12 PM, Liam Healy lhealy@common-lisp.net wrote:
There isn't an inverse to cl-array at present.
Some thoughts about this, without having yet dived into the code: my first recommendation is to just make-marray for everything by default. When you need a regular CL array, use cl-array to extract it, and then if you need to, copy it (see below). The problem with supplying an array directly to be made into a marray is that it may not be "foreign friendly". This won't make any difference on most implementations, but on SBCL, you will get unpredictable results because SBCL will avoid copying the array over to the C side and just send a pointer to the GSL functions. I could perhaps add the ability to supply a foreign-friendly array, as made by make-ffa, as an :initial-contents for make-marray.
If you are willing to always have the array copied, that could be done pretty easily too. As a side point, please note that changing an element of an array extracted with cl-array will change the marray in SBCL and have unpredictable results on other implementations. This is why I recommend you copy the array after you extract it.
Liam
On Tue, Feb 10, 2009 at 8:49 AM, Mirko Vukovic mirko.vukovic@gmail.com wrote:
On Tue, Feb 10, 2009 at 5:09 AM, Niitsuma Hirotaka hirotaka.niitsuma@gmail.com wrote:
I can not find convert function #A(...) -> #m(...)
( cl-array is conversion #m -> #a )
Thus I write the following ,but that looks slow.
(defun coerce-array-to-list (in-array) (map 'list #'identity (make-array (array-total-size in-array) :element-type (array-element-type in-array) :displaced-to in-array))) ;borrow from http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/a925ca60d...
(defun appropriate-name (element-type ar) (make-marray element-type :dimensions (array-dimensions ar) :initial-contents (coerce-array-to-list ar)) )
usage: ( appropriate-name 'double-float #2A((1.0d0 2.0d0) (2.0d0 5.0d0))) -> #m((1.0d0 2.0d0) (2.0d0 5.0d0)))
Gsll-devel mailing list Gsll-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel
I don't know an answer better than yours. I would name the function gsll-array. Also, since marray's are objects, you may want to look into its constructor to see how the array is stored.
I was bitten a few times by the make-marray syntax that requires a list input.
(As far as I see, lisp's coerce syntax prevents us from customizing it to do the job we want.)
Mirko
Gsll-devel mailing list Gsll-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel