Eric == Eric M Ludlam [EMAIL PROTECTED] writes:
Nick Sieger [EMAIL PROTECTED] seems to think that:
PK == Paul Kinnucan [EMAIL PROTECTED] writes:
PK Eric M. Ludlam writes:
Something I always wanted to do was use EIEIO to wrap Java
objects. EIEIO could act as a proxy for Java objects, and there
could be Java object proxies for EIEIO objects. In this world
people who know Emacs could hack Java, and vice-versa w/out
having to know the other language much.
PK I've suggested to Nick Sieger that he use eieio proxies for the
PK Lisp counterparts that JUCI generates for Java classes.
I'm very interested in doing this, and as soon as I find time to
learn enough about EIEIO to feel comfortable I'll do this. But for
now, a Java method call is mapped to a plain-old-defun :-|
Eric [ ... ]
Eric I can help you do this. I don't have a working JDEE install at
Eric home though. I can help you create new classes and methods at
Eric runtime instead of in code. The secret is that if you want to
Eric use `defclass' or `defmethod', but don't want to write out code,
Eric you can use `eieio-defclass' and `eieio-defmethod' instead.
Eric Let me know what data you have and what you would ideologically
Eric like, and I can try to prototype it for you to get you started.
Of course. Making runtime, dynamic proxies, I wouldn't have thought
of that, but it makes good sense.
On the Java side, an interface needs to be declared that we'd bind to.
There also needs to be a provided implementation of that interface to
actually invoke, but the schema of the object if you will should be
in a Java interface (or interface inheritance hierarchy).
The more I think about it, maybe this isn't as hard as I initially
thought. The basic idea is to create an EIEIO class for each
interface, starting with a provided interface, and traversing up the
interface's inheritance hierarchy. Does EIEIO support multiple
inheritance? Ideally it would, since Java interfaces can extend
multiple superinterfaces. A recipe for a prototype might do something
like this:
1. Call `jde-complete-get-classinfo' with the name of the Java
interface we're proxying. Currently, this returns a data structure
like the following:
(jde-complete-get-classinfo jde.juci.test.Echo)
==
((ack(java.lang.String) : java.lang.String . ack())
(roundTrip(java.lang.Object) : java.lang.Object . roundTrip()))
where jde.juci.test.Echo looks like this:
public interface Echo {
String ack(String message);
Object roundTrip(Object input);
}
Unfortunately, `jde-complete-get-classinfo' only returns method
information, not superclass/superinterface info. Is there another
JDE method that would provide the methods of a class but also the
supers (anyone)?
2. Create the EIEIO class to be structured something like this
(assuming the implementation of the Echo interface is
`jde.juci.test.EchoImpl'):
(defclass jde-juci-test-echo ()
()
EIEIO proxy for jde.juci.test.Echo)
(defmethod jde-juci-test-echo-ack ((this jde-juci-test-echo) message)
Proxy method for jde.juci.test.Echo.ack(String)
(jde-juci-invoke-java jde.juci.test.EchoImpl ack message))
(defmethod jde-juci-test-echo-round-trip ((this jde-juci-test-echo) input)
Proxy method for jde.juci.test.Echo.ack(String)
(jde-juci-invoke-java jde.juci.test.EchoImpl ack input))
Now, the fun part is figuring out what to do with the proxies. Does
this seem reasonable so far? Anything I left out or that you would do
differently?
The next logical step would seem to be to make JDEE plugins simple
java classes, that possibly implement a pre-defined interface. On the
Elisp side, these would be EIEIO proxies that extend a base class that
would provide the plugin infrastructure (registration in a menu,
documentation, etc.).
/Nick