* Java arrays to Scheme
@ 2017-02-03 20:33 Peter Lane
2017-02-03 23:24 ` Per Bothner
0 siblings, 1 reply; 2+ messages in thread
From: Peter Lane @ 2017-02-03 20:33 UTC (permalink / raw)
To: kawa
Hi list,
I'm trying to understand how to interact with Java functions which
return arrays, e.g. double[][] or int[].
When I call a function which returns an int[] or double[][] they display
as numbers within [ ... ] square brackets. I can extract their length
and elements, e.g. using (x 0) etc where x is the array.
What kind of object are these in the Scheme universe? array? vector?
and the uniform vector tests return #f.
I tried an idea I found under uniform vectors, to try to make a uniform
vector share the Java array, but I only get type errors.
I would like to convert these Java arrays into a Scheme list or vector,
which should be a simple function to write. But is there a
function/trick like that already?
thanks,
Peter.
--
Peter Lane
http://peterlane.info/scheme.html
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Java arrays to Scheme
2017-02-03 20:33 Java arrays to Scheme Peter Lane
@ 2017-02-03 23:24 ` Per Bothner
0 siblings, 0 replies; 2+ messages in thread
From: Per Bothner @ 2017-02-03 23:24 UTC (permalink / raw)
To: Peter Lane, kawa
On 02/03/2017 12:33 PM, Peter Lane wrote:
> Hi list,
>
> I'm trying to understand how to interact with Java functions which return arrays, e.g. double[][] or int[].
>
> When I call a function which returns an int[] or double[][] they display as numbers within [ ... ] square brackets. I can extract their length and elements, e.g. using (x 0) etc where x is the array.
>
> What kind of object are these in the Scheme universe? array? vector?
They are Java arrays. They are not Scheme vectors or arrays.
However, they are "vector-like", and can be converted to other sequence types
using splices.
(The '!' operator is roughly the same as define-constant. Using either
improves type inference in the REPL.)
#|kawa:1|# (! ar (int[] 4 -5 6))
#|kawa:2|# ar
[4 -5 6]
> I would like to convert these Java arrays into a Scheme list or vector, which should be a simple function to write. But is there a function/trick like that already?
#|kawa:3|# (vector @ar)
#(4 -5 6)
#|kawa:4|# (list @ar)
(4 -5 6)
#|kawa:5|# (s32vector @ar)
#s32(4 -5 6)
#|kawa:6|# (u32vector @ar)
#u32(4 4294967291 6)
Note the splice operator makes a copy - it does not share the array.
However, you can use the ->sequence cast to make them share.
(The syntax (->TYPE VALUE) is generally the same as (as TYPE VALUE).)
#|kawa:7|# (->sequence ar)
#s32(4 -5 6)
#|kawa:8|# (! seq (->sequence ar))
#|kawa:9|# seq
#s32(4 -5 6)
#|kawa:10|# (set! (ar 2) 16)
#|kawa:11|# ar
[4 -5 16]
#|kawa:12|# seq
#s32(4 -5 16)
#|kawa:13|# (set! (seq 0) 8)
java.lang.ClassCastException: gnu.math.IntNum cannot be cast to java.lang.Integer
at gnu.lists.S32Vector.setRaw(S32Vector.java:10)
at gnu.lists.AbstractSequence.set(AbstractSequence.java:214)
at gnu.kawa.functions.Setter$SetList.apply2(Setter.java:133)
at gnu.mapping.Procedure.apply(Procedure.java:138)
at gnu.mapping.Procedure.apply(Procedure.java:118)
at gnu.mapping.CallContext.runUntilDone(CallContext.java:227)
at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:350)
at gnu.expr.ModuleExp.evalModule(ModuleExp.java:212)
at kawa.Shell.run(Shell.java:283)
at kawa.Shell.run(Shell.java:196)
at kawa.Shell.run(Shell.java:183)
at kawa.repl.processArgs(repl.java:714)
at kawa.repl.main(repl.java:820)
Ooops - that really should work. But we can use a cast:
#|kawa:14|# (set! (seq 0) (->int 8))
#|kawa:15|# seq
#s32(8 -5 16)
#|kawa:16|# ar
[8 -5 16]
Casting to a u32vector is trickier:
#|kawa:17|# (->u32vector ar)
/dev/stdin:17:14: warning - type int[] is incompatible with required type u32vector
java.lang.ClassCastException: [I cannot be cast to gnu.lists.U32Vector
at atInteractiveLevel-17.run(stdin:17)
at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:293)
at gnu.expr.ModuleExp.evalModule(ModuleExp.java:212)
at kawa.Shell.run(Shell.java:283)
at kawa.Shell.run(Shell.java:196)
at kawa.Shell.run(Shell.java:183)
at kawa.repl.processArgs(repl.java:714)
at kawa.repl.main(repl.java:820)
Oops - that really should work, too ...
You can use a raw constructor, though:
#|kawa:19|# (gnu.lists.U32Vector ar)
#u32(8 4294967291 16)
--
--Per Bothner
per@bothner.com http://per.bothner.com/
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-02-03 23:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-03 20:33 Java arrays to Scheme Peter Lane
2017-02-03 23:24 ` Per Bothner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).