>> "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

Reply via email to