我正在使用Java搜索API以处理JVM中Common Lisp语言的Armed Bear Common Lisp(ABCL)实现中的值。
当函数返回(仅)列表或字符串时,它会起作用。
当它返回多个values时,我只能获取第一个返回值。
我不知道如何获取其他值。
这是我的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();
}
答案 0 :(得分:2)
您正在寻找multiple-value-bind
或nth-value
,还是还有其他问题?
答案 1 :(得分:0)
您可以在Lisp端使用multiple-value-bind
等来分配单独的变量,然后在Java中单独访问它们。或者你可以从Java调用multiple-value-bind
。这不是你要找的答案。我假设您真正喜欢的是一种可以用Java调用的方法,它将直接获得第一个以外的值。我没有那个答案,但没有人提供这个答案。
然而,在源代码和javadoc中,我看到类Primitives
和Symbol
有方法VALUES
和MULTIPLE_VALUE_BIND
。我猜这些不是设计用于在用户源代码中调用的,但它们至少可以帮助您找到所需的答案。
最后,我认为这可能是你需要在ABCL邮件列表上询问的内容。您可以在此处报告完整答案,作为您自己问题的答案。
答案 2 :(得分: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());
}
答案 3 :(得分:0)
我认为上面的代码存在两个复制粘贴错误(您想在最后两行中使用myFunctionSym2
和myFunction2
,即
Function myFunction2 = (Function) myFunctionSym2.getSymbolFunction();
LispObject o2 = myFunction2.execute();
System.out.println(o2.listp()); // additional line added by me
有了它,它对我有用。