I have compiled Lisp code and I want to make a front end GUI for it. I chose Java swing to develop the GUI. Now I want to call the LISP code (SBCL) from java application! Is there any way to do that? How to execute lisp code from Java? Thanks
Asked
Active
Viewed 1,333 times
1
-
`java.lang.ProcessBuilder`? – trashgod Jan 22 '15 at 11:59
-
I will try this. Thank you. Any hints or tips or tutorials? – Hamda Binte Ajmal Jan 22 '15 at 12:27
-
1The [tag:ProcessBuilder] tag is a good start. – Catalina Island Jan 22 '15 at 12:31
-
4There is a Common Lisp which directly runs on the JVM: http://abcl.org – Rainer Joswig Jan 22 '15 at 13:07
-
I came to mention exactly what Rainer already said. Have you tried running your code under ABCL? That would probably be the easiest route. – Joshua Taylor Jan 22 '15 at 13:44
-
A good start for ProcessBuilder would be the documentation: http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html – Svante Jan 22 '15 at 14:31
-
Today I would have made a rest API that is used by the front end. You can then support having more than one UI (textual shell, backbone.js, ...) and of course have B2B interface available for axiomatization. – Sylwester Jan 22 '15 at 14:54
-
But the lisp code is in SBCL not common Lisp – Hamda Binte Ajmal Jan 22 '15 at 16:42
-
1@HamdaBinteAjmal SBCL is Steel Bank Common Lisp, which is an implementation of the Common Lisp standard. – Svante Jan 22 '15 at 23:00
-
Okay, thank you, I will look into it as I am not an expert in LISP programming – Hamda Binte Ajmal Jan 23 '15 at 11:14
1 Answers
3
I believe that the best solution for you is use:
http://common-lisp.net/project/armedbear/
You cand find this samples on that web
/*
* Main.java
*
* Copyright (C) 2008 Ville Voutilainen
* $Id$
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import org.armedbear.lisp.*;
public class Main
{
/**
* This example creates an Interpreter instance, loads our
* lisp code from a file and then looks up a function defined
* in the loaded lisp file and executes the function.
*
* The function takes a single parameter and invokes a java method
* on the object provided. We provide our Main object as the parameter.
*
*/
public static void main(String[] argv)
{
try
{
Main thisObject = new Main();
Interpreter interpreter = Interpreter.createInstance();
interpreter.eval("(load \"lispfunctions.lisp\")");
// the function is not in a separate package, thus the
// correct package is CL-USER. Symbol names are
// upper case. Package needs the prefix, because java
// also has a class named Package.
org.armedbear.lisp.Package defaultPackage =
Packages.findPackage("CL-USER");
Symbol voidsym =
defaultPackage.findAccessibleSymbol("VOID-FUNCTION");
Function voidFunction = (Function) voidsym.getSymbolFunction();
voidFunction.execute(new JavaObject(thisObject));
}
catch (Throwable t)
{
System.out.println("exception!");
t.printStackTrace();
}
}
public int addTwoNumbers(int a, int b)
{
return a + b;
}
}
;;; lispfunctions.lisp
;;;
;;; Copyright (C) 2008 Ville Voutilainen
;;; $Id$
;;;
;;; This program is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU General Public License
;;; as published by the Free Software Foundation; either version 2
;;; of the License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software
;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
; we need to get the
; 1) class (Main)
; 2) classes of the parameters (int)
; 3) method reference (getting that requires the class
; of our object and the classes of the parameters
; After that we can invoke the function with jcall,
; giving the method reference, the object and the parameters.
; The result is a lisp object (no need to do jobject-lisp-value),
; unless we invoke the method
; with jcall-raw.
(defun void-function (param)
(let* ((class (jclass "Main"))
(intclass (jclass "int"))
(method (jmethod class "addTwoNumbers" intclass intclass))
(result (jcall method param 2 4)))
(format t "in void-function, result of calling addTwoNumbers(2, 4): ~a~%" result)))
and also an excelent mannual for doing that

anquegi
- 11,125
- 4
- 51
- 67
-
Yes I have done that and I was about to post it. Thanks for the suggestion. Worked like a charm – Hamda Binte Ajmal Jan 24 '15 at 17:13
-
Hey. Running abcl lisp functions from Java code loads the files at runtime. Does it mean I will have to ship the .lisp files with the product? – Hamda Binte Ajmal Jan 25 '15 at 12:16
-
Hi Hamda, maybe you can compile it to fasl. and execute from the compiled lisp files, I didn't try it yet – anquegi Jan 26 '15 at 06:53
-
I cant find any code example from Lisp that executes a funtion from Fasl – Hamda Binte Ajmal Jan 26 '15 at 15:41
-
Hi again, In this question http://stackoverflow.com/questions/9055589/how-can-i-run-sbcl-code-under-a-unix-like-operating-system-in-a-convenient-way you have how to compile the lisp files to fasl usinc sbcl, maybe you can use this compiled files with abcl, bt I'm not sure – anquegi Jan 27 '15 at 18:56