[armedbear-cvs] r11385 - trunk/j/examples/abcl/java_exception_in_lisp

Ville Voutilainen vvoutilainen at common-lisp.net
Sat Nov 8 19:06:53 UTC 2008


Author: vvoutilainen
Date: Sat Nov  8 19:06:53 2008
New Revision: 11385

Log:
Add a simple example of catching a java exception in lisp code.


Added:
   trunk/j/examples/abcl/java_exception_in_lisp/
   trunk/j/examples/abcl/java_exception_in_lisp/Main.java   (contents, props changed)
   trunk/j/examples/abcl/java_exception_in_lisp/lispfunctions.lisp   (contents, props changed)

Added: trunk/j/examples/abcl/java_exception_in_lisp/Main.java
==============================================================================
--- (empty file)
+++ trunk/j/examples/abcl/java_exception_in_lisp/Main.java	Sat Nov  8 19:06:53 2008
@@ -0,0 +1,63 @@
+/*
+ * 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("abcl exception!");
+		t.printStackTrace();
+	    }
+    }
+    public int addTwoNumbers(int a, int b)
+    {
+	throw new RuntimeException("Exception from java code");
+    }
+}
\ No newline at end of file

Added: trunk/j/examples/abcl/java_exception_in_lisp/lispfunctions.lisp
==============================================================================
--- (empty file)
+++ trunk/j/examples/abcl/java_exception_in_lisp/lispfunctions.lisp	Sat Nov  8 19:06:53 2008
@@ -0,0 +1,38 @@
+;;; 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 function throws an exception, so we wrap the call in
+; handler-case.
+(defun void-function (param)
+  (let* ((class (jclass "Main"))
+	 (intclass (jclass "int"))
+	 (method (jmethod class "addTwoNumbers" intclass intclass)))
+    (handler-case
+	(jcall method param 2 4)
+      (java-exception (exception)
+	(format t "Caught a java exception in void-function~%")))))
+




More information about the armedbear-cvs mailing list