[armedbear-devel] How to use JARRAY-SET to fill a byte array?
Mark Evenson
evenson at panix.com
Tue Sep 14 14:14:29 UTC 2010
On Sep 14, 2010, at 09:08 , Alessio Stalla wrote:
> On Tue, Sep 14, 2010 at 8:45 AM, Chun Tian (binghe)
> <binghe.lisp at gmail.com> wrote:
>> Hi again ... ABCL
>>
>> I want to fill a Java byte[] array. But I don't know how to correctly use JARRAY-SET (I should use it, right?):
>>
>> CL-USER(1): (defvar $*byte (jclass "byte"))
>> $*BYTE
>> CL-USER(2): (setf array (jnew-array $*byte 10))
>> #<jarray [B at 7a2ee7e5 {1D7AAA0E}>
>> CL-USER(3): (jarray-set array 1 0)
>> #<THREAD "interpreter" {6E61A414}>: Debugger invoked on condition of type JAVA-EXCEPTION
>> Java exception 'java.lang.IllegalArgumentException: argument type mismatch'.
>> Restarts:
>> 0: TOP-LEVEL Return to top level.
>> [1] CL-USER(4): 0
>> CL-USER(5): (jarray-ref array 0)
>> 0
>>
>> So, a plain number "1" cannot work, but what else I can do? a object of java.lang.Byte?
>
> You need to convert 1 to a Java byte... honestly I don't know if and
> how it can be done. Our fixnums are mapped to integers... we should
> probably extend jcoerce to handle numeric conversions as well. And
> conversion of numeric arrays, while we're at it.
As Alessio probably well knows, you can produce a java byte for say "23" briefly as follows
(jcall (jmethod "java.lang.Byte" "byteValue")
(jnew "java.lang.Byte" (format nil "~A" 23)))
but it returns as a Lisp integer before you can grab that reference.
Extending JCOERCE is probably the way to go here.
--
"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