Java Can ABCL';s解释器是否从InputStream加载Lisp源?

Java Can ABCL';s解释器是否从InputStream加载Lisp源?,java,lisp,common-lisp,abcl,Java,Lisp,Common Lisp,Abcl,我刚刚开始考虑将一些Lisp混合到Java中。现在,从一个文件中加载一些Lisp就足够了,我一直在看。在每种情况下,模式都是: Interpreter interpreter = Interpreter.createInstance(); interpreter.eval("(load \"lispfunctions.lisp\")"); 但是假设我正在构建一个Maven项目,目的是将其打包为一个JAR:如何从src/main/resources加载lispfunctions.lisp?我可以

我刚刚开始考虑将一些Lisp混合到Java中。现在,从一个文件中加载一些Lisp就足够了,我一直在看。在每种情况下,模式都是:

Interpreter interpreter = Interpreter.createInstance();
interpreter.eval("(load \"lispfunctions.lisp\")");

但是假设我正在构建一个Maven项目,目的是将其打包为一个JAR:如何从
src/main/resources
加载
lispfunctions.lisp
?我可以很容易地得到一个
InputStream
-我可以用它去什么地方吗?或者,对于从这样的资源加载Lisp源代码,我这里缺少了另一个习惯用法吗?

我已经做到了以下几点。我正在MacOS上使用ABCL 1.7.0,尽管我很确定这不是特定于版本的

/* load_lisp_within_jar.java -- use ABCL to load Lisp file as resource in jar
 * copyright 2020 by Robert Dodier
 * I release this work under terms of the GNU General Public License
 */

/* To run this example:
$ javac -cp /path/to/abcl.jar -d . load_lisp_within_jar.java
$ cat << EOF > foo.lisp
(defun f (x) (1+ x))
EOF
$ jar cvf load_lisp_within_jar.jar load_lisp_within_jar.class foo.lisp
$ java -cp load_lisp_within_jar.jar:/path/to/abcl.jar load_lisp_within_jar
 *
 * Expected output:
(F 100) => 101
 */
import org.armedbear.lisp.*;
import java.io.*;

public class load_lisp_within_jar {
    public static void main (String [] args) {
        try {
            // It appears that interpreter instance is required even though
            // it isn't used directly; I guess it arranges global resources.
            Interpreter I = Interpreter.createInstance ();

            LispObject LOAD_function = Symbol.LOAD.getSymbolFunction ();

            // Obtain an input stream for Lisp source code in jar.
            ClassLoader L = load_lisp_within_jar.class.getClassLoader ();
            InputStream f = L.getResourceAsStream ("foo.lisp");
            Stream S = new Stream (Symbol.SYSTEM_STREAM, f, Symbol.CHARACTER);

            // Call COMMON-LISP:LOAD with input stream as argument.
            LOAD_function.execute (S);

            // Verify that function F has been defined.
            Symbol F = Packages.findPackage ("COMMON-LISP-USER").findAccessibleSymbol ("F");
            LispObject F_function = F.getSymbolFunction ();
            LispObject x = F_function.execute (LispInteger.getInstance (100));
            System.out.println ("(F 100) => " + x.javaInstance ());
        }
        catch (Exception e) {
            System.err.println ("oops: " + e);
            e.printStackTrace ();
        }
    }
}
/*在_jar.java中加载_lisp _——使用ABCL将lisp文件作为jar中的资源加载
*Robert Dodier版权所有2020
*我根据GNU通用公共许可证的条款发布此作品
*/
/*要运行此示例,请执行以下操作:
$javac-cp/path/to/abcl.jar-d。在_jar.java中加载_lisp_
$cat foo.lisp
(定义f(x)(1+x))
EOF
$jar cvf load_lisp_jar.jar load_lisp_jar.class foo.lisp内
$java-cp load_lisp_jar.jar内:/path/to/abcl.jar load_lisp_jar内
*
*预期产出:
(F 100)=>101
*/
导入org.armedbear.lisp.*;
导入java.io.*;
在jar中加载公共类{
公共静态void main(字符串[]args){
试一试{
//似乎需要解释器实例,即使
//它不是直接使用的,我想它是安排全球资源的。
解释器I=解释器.createInstance();
LispObject LOAD_function=Symbol.LOAD.getsymbol函数();
//获取jar中Lisp源代码的输入流。
ClassLoader L=load_lisp_在_jar.class.getClassLoader()中;
InputStream f=L.getResourceAsStream(“foo.lisp”);
流S=新流(Symbol.SYSTEM\u Stream,f,Symbol.CHARACTER);
//调用COMMON-LISP:LOAD,将输入流作为参数。
加载函数。执行;
//验证是否已定义函数F。
符号F=Packages.findPackage(“COMMON-LISP-USER”).findAccessibleSymbol(“F”);
LispObject F_function=F.getSymbolFunction();
LispObject x=F_function.execute(LispInteger.getInstance(100));
System.out.println(“(F 100)=>”+x.javaInstance());
}
捕获(例外e){
System.err.println(“oops:+e”);
e、 printStackTrace();
}
}
}
如您所见,程序首先获取与符号加载相关联的函数。(为了方便起见,许多,可能所有的COMMON-LISP符号都有静态定义,因此您可以只说
Symbol.LOAD
,而不是通过
findAccessibleSymbol
查找符号),然后将输入流提供给加载函数。之后,我们验证函数F确实已定义


我知道这些东西有点晦涩难懂;我很乐意回答任何问题。

这可能不是最好的方法,但您可以评估lisp代码编译或加载.lisp。比如“(加载文件\“lispfunctions.lisp\”),我想你没有找到一个特定的函数来做你想做的事情是因为它可以通过通用的lisp对象接口来完成。由于
load file
是一个lisp函数,因此它是一个lisp对象。您也可以通过lisp对象java接口访问它。我认为它应该是类似于
Packages.findPackage(“CL”).findAccessibleSymbol(“FIND-PACKAGE”).getSymbolFunction().execute(“lispffunctions.lisp”)new stream(Symbol.SYSTEM\u stream,f,Symbol.CHARACTER)
创建Lisp流,其中
f
InputStream
。谢谢Robert。我现在可以得到一个
,但是接下来呢?说清楚点,我想做的就是这样。如何获取
CL-USER
并从Java调用Lisp函数,如示例所示?谢谢Robert。在这里工作。谢谢你帮我接电话。太好了,很高兴听到。