[armedbear-devel] How to create a byte[] from a Lisp vector? (was Re: MAKE-IMMEDIATE-OBJECT and JOBJECT-LISP-VALUE conceptual problem)

Mark Evenson evenson at panix.com
Tue Jun 14 10:49:13 UTC 2011


On 6/11/11 09:06 , Alan Ruttenberg wrote:
> I've always disliked make-immediate-object. Really it serves the
> purpose of disambiguating a few overloaded values in lisp. I'd like to
> deprecate it in favor of specific constants for java-true, java-false
> and null-pointer (the latter is already available as function).

Unless anyone speaks up against this, I will make this change to the 
Java API.

> It seems dangerous to assume that one can get some java array as the
> underlying object below a lisp array, what with all the hair that lisp
> arrays can have.  Better to allocate your buffer with (jnew-array
> "byte" 8192) and not get into this game. Or have a documented policy
> of how java objects correspond to lisp objects and promise to support
> it forever.

I agree that we probably shouldn't go down the path of exposing the 
"internal" byte array here.

But I still couldn't find a way to covert a Lisp array of en masse to a 
Java byte[] structure.

One can't construct a byte from a Lisp integer with JAVA:JNEW

CL-USER> (jnew "byte" 0)

fails with #<JAVA-EXCEPTION java.lang.NoSuchMethodException: 
byte(java.lang.Integer) {39397F0A}>.

Same for

CL-USER> (jnew "java.lang.Byte" 0)

for the same reason.

One can use the Byte(string) constructor

CL-USER> (jnew "java.lang.Byte" "0")

but that seems kludgy in the extreme.  Does anybody have a way to create 
a JAVA-OBJECT containing a byte?  Did I miss something basic?

And JNEW-ARRAY-FROM-ARRAY on a Lisp vectors of numbers also fails, so 
there really seems to be another lacunae in our API.

In order to work through this, I modified ABCL in [r13327]() and 
[r13328]() to get

CL-USER> (jcoerce 0 "byte")

to return a "boxed" byte.

and added the ability to form a byte[] from the appropriate Lisp vector.

CL-USER> (type-of buffer)
(SIMPLE-ARRAY (UNSIGNED-BYTE 8) (8192))
CL-USER> (jnew-array-from-array "byte" buffer)
#<jarray [B at 61d60df3 {2C2DFEB3}>

[r13327]: http://trac.common-lisp.net/armedbear/changeset/13327
[r13328]: http://trac.common-lisp.net/armedbear/changeset/13328

The conversion maps any number to its signed twos-complement value 
modulo 256, which I think is the right thing.

Please pipe up if this is the wrong way to move the ABCL Java API 
forward to more usability.

-- 
"A screaming comes across the sky.  It has happened before, but there
is nothing to compare to it now."




More information about the armedbear-devel mailing list