3

我正在搜索 API 以使用 Java 处理 JVM 中 Common 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();

}
4

4 回答 4

2

multiple-value-bindnth-value你在寻找什么,或者这个问题还有更多的东西吗?

于 2013-08-27T12:27:17.410 回答
0

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

但是,在源代码和 javadoc 中四处寻找,我看到了这些类PrimitivesSymbol具有方法VALUESMULTIPLE_VALUE_BIND. 我猜这些不是为了在用户源代码中调用而设计的,但它们至少可以帮助你找到你想要的答案。

最后,我认为这可能是您需要在 ABCL 邮件列表中提出的问题。您可以在此处报告完整答案作为您自己问题的答案。

于 2013-08-27T18:49:14.170 回答
0

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

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

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()); }

于 2014-12-09T11:35:14.610 回答
0

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

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

有了这个,它对我有用。

于 2018-10-11T17:16:13.820 回答