Alessio Stalla alessiostalla@gmail.com wrote:
You do need one. You can either use ABCL's one - in that case you have to pass something like --eval "(your-main-function)", perhaps with a shell script - or write a custom one in Java that will call the right Lisp function.
Here's the closest thing I have to "standalone" ABCL executables so far. Comments welcome (remember: I don't know Java).
Main.java:
| import org.armedbear.lisp.*; | | public class Main | { | public static void main (String[] argv) | { | try | { | LispObject cmdline = Lisp.NIL; | for (String arg : argv) | cmdline = new Cons (arg, cmdline); | cmdline.nreverse (); | Lisp._COMMAND_LINE_ARGUMENT_LIST_.setSymbolValue (cmdline); | | Interpreter interpreter = Interpreter.createInstance (); | // load a lisp file like main.lisp or so. | } | catch (Throwable t) | { | t.printStackTrace (); | } | } | }
javac -cp /usr/local/pkg/common-lisp/abcl/* Main.java java -cp /usr/local/pkg/common-lisp/abcl/*:. Main [options...]
And now from that interpreter (in fact, its #'main function), *command-line-argument-list* contains the list of [options...], with the notable effect that none of them are processed by, or affect ABCL itself.
Two remarks:
- I can also provide my own jar file, only it seems painful to do because I would have to uncompress abcl.jar to get all its contents and then create my own by adding Main.class to it. I've seen threads dating back to 2007 about adding jar files to jar files directly but it seems that it still doesn't work the way I want it to (accessing the sub-jar's contents). Correct?
- A cleaner way to do the above would have been to extend the Interpreter class by adding a new method, e.g. createStandaloneInstance, as a mixture of createDefaultInstance and createInstance. Unfortunately, this is not possible because this class is final.