From: <as...@ma...> - 2003-11-18 20:39:15
|
jcall and friends all call makeLispObject to convert the result of the call to a native Lisp type when possible. While this is compatible with what jlinker does, and is often quite useful, sometimes a JavaObject would be much better, e.g. when one wants to use the result returned as an argument to another call to Java. As things stand, I have no idea how to pass a Boolean to a Java method that wants one. I wonder if there's a way to always get JavaObject as a result of calling jfield &al. If not, then I think it would be a good idea to extend these functions to accept a keyword arg which specifies what kind of result the caller wants. Andras |
From: Peter G. <pe...@ar...> - 2003-11-19 16:08:50
|
On Tue, 18 Nov 2003 at 22:38:05 +0100, Andr=E1s_Simon wrote: > jcall and friends all call makeLispObject to convert the result of the > call to a native Lisp type when possible. While this is compatible with= > what jlinker does, and is often quite useful, sometimes a JavaObject > would be much better, e.g. when one wants to use the result returned > as an argument to another call to Java. As things stand, I have no > idea how to pass a Boolean to a Java method that wants one. > > I wonder if there's a way to always get JavaObject as a result of > calling jfield &al. If not, then I think it would be a good idea to > extend these functions to accept a keyword arg which specifies what > kind of result the caller wants. Correct me if I'm wrong, but I think what you're saying here is that if you try to do something like (jcall method instance nil) and the method in question wants a Boolean for the NIL argument, it's not going to work, since JCALL is going to do NIL.javaInstance(), which will end up invoking LispObject.javaInstance(), which will signal a type error. Right? (I haven't actually tried this, but that's what it looks like would happen.) I think what you need for this is jlinker's MAKE-IMMEDIATE-OBJECT: http://www.franz.com/support/documentation/6.2/doc/pages/operators/ja= vatools.jlinker/make-immediate-object.htm Then, in theory, you could do (jcall method instance (make-immediate-object nil :boolean)) and the Java method would get the Boolean it was hoping for. In principle, MAKE-IMMEDIATE-OBJECT seems like it would be pretty straightforward to implement: public LispObject execute(LispObject[] args) { LispObject arg =3D args[0]; LispObject type =3D args[1]; if (type =3D=3D Keyword.BOOLEAN) { if (arg =3D=3D NIL) return new JavaObject(Boolean.TRUE); else return new JavaObject(Boolean.FALSE); } } etc. (glossing over a number of picky details). I think we could start with a small subset of the combinatorial explosion advertised in the table on the aforementioned web page and add more combinations as we go along. Or am I missing the point here? -Peter |
From: <as...@pr...> - 2003-11-19 18:25:14
|
On Wed, 19 Nov 2003, Peter Graves wrote: > Correct me if I'm wrong, but I think what you're saying here is that if > you try to do something like > > (jcall method instance nil) > > and the method in question wants a Boolean for the NIL argument, it's > not going to work, since JCALL is going to do NIL.javaInstance(), which > will end up invoking LispObject.javaInstance(), which will signal a > type error. > > Right? (I haven't actually tried this, but that's what it looks like > would happen.) Right, but I wanted a little less than this. Just thought that it'd be nice if something like (jcall method instance (jfield "java.lang.Boolean" "FALSE" :unwrap nil)) worked. (The imaginary :unwrap is included because jfield by default will call makeLispObject and so returns NIL.) This is not as ambitious (and is much easier to implement!) as what you write, though I guess that that would've been my next wish :-) > > I think what you need for this is jlinker's MAKE-IMMEDIATE-OBJECT: > > http://www.franz.com/support/documentation/6.2/doc/pages/operators/ja= > vatools.jlinker/make-immediate-object.htm > > Then, in theory, you could do > > (jcall method instance (make-immediate-object nil :boolean)) > > and the Java method would get the Boolean it was hoping for. Oh, I wasn't aware of MAKE-IMMEDIATE-OBJECT, thanks! But even now I'm a little uncertain about it: CL-USER(299): (jnew (jconstructor "java.lang.Boolean" "boolean") (make-immediate-object t :type :boolean)) Error: #<JLINKER-ERROR :JAVA-ERROR - java.lang.IllegalArgumentException: argument type mismatch @ #x71ecd182> [condition type: JLINKER-ERROR] or, even worse: CL-USER(302): (jnew (jconstructor "java.lang.Boolean" "boolean") (make-immediate-object nil :type :boolean)) Error: #<JLINKER-ERROR :JAVA-ERROR - java.lang.NullPointerException @ #x71f266fa> [condition type: JLINKER-ERROR] The latter looks like a jlinker bug to me, but the first is more like a sign of my not quite getting it :-( > > In principle, MAKE-IMMEDIATE-OBJECT seems like it would be pretty > straightforward to implement: > > public LispObject execute(LispObject[] args) > { > LispObject arg =3D args[0]; > LispObject type =3D args[1]; > if (type =3D=3D Keyword.BOOLEAN) { > if (arg =3D=3D NIL) > return new JavaObject(Boolean.TRUE); > else > return new JavaObject(Boolean.FALSE); > } > } > > etc. (glossing over a number of picky details). > > I think we could start with a small subset of the combinatorial > explosion advertised in the table on the aforementioned web page and > add more combinations as we go along. I agree (perhaps we can get by without (make-immediate-object 12.3 :type :string) for a while :-)). But even if we have MAKE-IMMEDIATE-OBJECT, I think it'd be useful, though not strictly necessary, to allow jcall, etc. to return JavaObjects, so one can get away with (jcall ... (jcall ...)) and needn't write (jcall ... (make-immediate-object (jcall ...) :type :boolean)) > > Or am I missing the point here? Not at all! Andras |
From: <as...@pr...> - 2003-11-19 22:19:35
|
On Wed, 19 Nov 2003, [X-UNKNOWN] András Simon wrote: > > CL-USER(299): (jnew (jconstructor "java.lang.Boolean" "boolean") (make-immediate-object t :type :boolean)) > Error: #<JLINKER-ERROR :JAVA-ERROR - java.lang.IllegalArgumentException: argument type mismatch @ > #x71ecd182> > [condition type: JLINKER-ERROR] Ooops, type is not a keyword argument. (jnew (jconstructor "java.lang.Boolean" "boolean") (make-immediate-object t :boolean)) works fine. Sorry for the noise! Andras |