Re: Call to Fork or simply for JDEE TODO items
"Loyall, David" <[email protected]> Tue, 30 Apr 2013 21:17:31 +0000
| Newsgroups | gmane.emacs.jdee.devel |
|---|---|
| Message-ID | <FCEE4469EE8B234199968ECA9B0661E208CF2A8D@STNEEX10MB02.stone.ne.gov> |
> From: Paul Landes
[...]
> It isn't possible to duplicate the beanshell functionality in elisp. It has to be in
> Java or a Java scripting language since Java reflection is used for
> templating/wizards etc.
After reading this the first time and balking at the phrase "it isn't possible", I wrote a couple of Java classes for my amusement, and I hope yours, too. (See below.)
After reading this the second time, I realized that I missed your point. (If I hadn't missed the point, I would have tried to write elisp, not java.)
Incidentally, conversation regarding ABCL in the other messages in this thread is in line with the idea that I intended to express in the proof of concept: that emacs can carry on a conversation with a (thin) process in a running JVM in order to get information that isn't readily available outside of a JVM.
So, +1 for ABCL. (I've used it elsewhere and I like it. It seems to be maturing at a pretty good rate. Apparently MOP stuff works, and there's some maven-asdf bridge that I haven't tried yet.)
Regarding whether or not to fork, I can't comment on that, other than that it certainly wasn't my intent when I asked for a list of TODO items. :)
Cheers,
--Dave
>>>>>>>>>
hobbes@metalbaby:~/workspace/poc-el-reflection$ find .
.
./.classpath
./.project
./bin
./bin/gnu
./bin/gnu/emacs
./bin/gnu/emacs/ElispBridge.class
./bin/gnu/emacs/MyObject.class
./src
./src/gnu
./src/gnu/emacs
./src/gnu/emacs/ElispBridge.java
./src/gnu/emacs/MyObject.java
hobbes@metalbaby:~/workspace/poc-el-reflection$ head -1000 src/*/*/*
==> src/gnu/emacs/ElispBridge.java <==
package gnu.emacs;
import java.lang.reflect.Method;
public class ElispBridge {
public static void main(String[] args) throws Exception {
//TODO get these strings from stdin, or a socket, or SOAP, or whatever.
//I don't know lisp, so pardon me if these strings are silly.
String query1 = "('object-methods 'gnu.emacs.MyObject)";
String query2 = "('invoke-method 'gnu.emacs.MyObject 'getStuff)";
//TODO determine query type at runtime, instead of hardcoding it.
// query1 is looking for a list myObject's methods.
// query2 is looking for information about a method.
//query1 ...
//TODO extract object name from query more reliably.
String className = chewSexp(query1)[2];
Class<?> cls = Class.forName(className);
for (Method m : cls.getMethods()) {
//TODO return data to elisp in more elegant way.
System.out.println(m);
}
System.out.println("***\n\n");
// query2 ...
String otherClassName = chewSexp(query2)[2];
String methodName = chewSexp(query2)[3];
Class<?> otherCls = Class.forName(otherClassName);
Object instance = otherCls.newInstance();
System.out.println(otherCls.getMethod(methodName, null).invoke(instance, null));
//TODO POC the other dozens of things reflection can do.
}
private static String[] chewSexp(String sexp) {
// TODO Use off the shelf sexp parser, something with stacks...
return sexp.replaceAll("[()]","").split(" *'");
}
}
==> src/gnu/emacs/MyObject.java <==
package gnu.emacs;
public class MyObject {
public String getStuff(){
return "Hello, World!";
}
public void doNothing(String s, Object o, char[] ca){};
}
hobbes@metalbaby:~/workspace/poc-el-reflection$ cd bin; java gnu.emacs.ElispBridge
public java.lang.String gnu.emacs.MyObject.getStuff()
public void gnu.emacs.MyObject.doNothing(java.lang.String,java.lang.Object,char[])
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
***
Hello, World!
hobbes@metalbaby:~/workspace/poc-el-reflection/bin$
>>>>>>>>>
------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1