1

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

10
  • java.lang.ProcessBuilder? Commented Jan 22, 2015 at 11:59
  • I will try this. Thank you. Any hints or tips or tutorials? Commented Jan 22, 2015 at 12:27
  • 1
    The processbuilder tag is a good start. Commented Jan 22, 2015 at 12:31
  • 4
    There is a Common Lisp which directly runs on the JVM: abcl.org Commented Jan 22, 2015 at 13:07
  • 1
    @HamdaBinteAjmal SBCL is Steel Bank Common Lisp, which is an implementation of the Common Lisp standard. Commented Jan 22, 2015 at 23:00

1 Answer 1

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

Sign up to request clarification or add additional context in comments.

5 Comments

Yes I have done that and I was about to post it. Thanks for the suggestion. Worked like a charm
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?
Hi Hamda, maybe you can compile it to fasl. and execute from the compiled lisp files, I didn't try it yet
I cant find any code example from Lisp that executes a funtion from Fasl
Hi again, In this question stackoverflow.com/questions/9055589/… 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.