如何使用Java获取ABCL中的值



我正在搜索API,以使用Java在JVM中处理通用Lisp语言的Armed Bear Common Lisp(ABCL)实现中的值。

当函数(仅)返回列表或字符串时,它就起作用了。

当它返回多个值时,我只能获取第一个返回的值。

我不知道如何获取其他值。

这是我的test.lisp文件:

(defun get-list ()
   (list "abc" 12 'a 'b))
(defun get-value ()
    (values "abc" 12 'a 'b))

我的Java代码是:

public static void main(String[] args) throws Exception {
    Interpreter interpreter = Interpreter.createInstance();
    LispObject lobj = interpreter.eval("(load "test.lisp")");
    org.armedbear.lisp.Package defaultPackage = Packages.findPackage("CL-USER");
    Symbol myFunctionSym = defaultPackage.findAccessibleSymbol("GET-LIST");
    Function myFunction = (Function) myFunctionSym.getSymbolFunction();
    LispObject o = myFunction.execute();
    System.out.println(o.listp());    // this return false
    Symbol myFunctionSym2 = defaultPackage.findAccessibleSymbol("GET-VALUE");
    Function myFunction2 = (Function) myFunctionSym.getSymbolFunction();
    LispObject o2 = myFunction.execute();
}

您想要的是multiple-value-bind还是nth-value,或者这个问题还有其他问题吗?

您可以在Lisp端使用multiple-value-bind等来分配单独的变量,然后在Java中单独访问它们。或者您可以从Java调用multiple-value-bind。这不是你想要的答案。我假设您真正想要的是一个可以在Java中调用的方法,该方法将直接获得第一个值以外的值。我没有这个答案,但没有其他人提供这个答案。

然而,在源代码和javadoc中,我发现类PrimitivesSymbol具有方法VALUESMULTIPLE_VALUE_BIND。我想这些并不是为了在用户源代码中调用而设计的,但它们至少可以帮助您找到想要的答案。

最后,我认为这可能是你需要在ABCL邮件列表上问的问题。你可以在这里报告完整的答案,作为你自己问题的答案。

对返回多个值的函数进行调用后,这些值将与正在执行的LispThread相关联,直到下一次调用Lisp为止。

可以通过调用getValues()来访问作为LispObject实例列表的values对象,如下代码所示:

org.armedbear.lisp.Package cl = Packages.findPackage("CL"); Symbol valuesSymbol = cl.findAccessibleSymbol("VALUES"); LispObject[] valuesArgs = { LispInteger.getInstance(1), LispInteger.getInstance(2) }; LispObject result = valuesSymbol.execute(valuesArgs); LispObject[] values = LispThread.currentThread().getValues(); for (LispObject value: values) { System.out.println("value ==> " + value.printObject()); }

我认为上面的代码有两个复制粘贴错误(您希望在最后两行中使用myFunctionSym2myFunction2,即

Function myFunction2 = (Function) myFunctionSym2.getSymbolFunction();
LispObject o2 = myFunction2.execute();
System.out.println(o2.listp()); // additional line added by me

有了这个,它对我有效。

最新更新