我正在使用Java在JVM中搜索用于处理通用Lisp语言的武装熊通用Lisp (ABCL)实现中的值的API。
当函数(仅)返回列表或字符串时,它才起作用。
当它返回多个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();
}发布于 2013-08-27 20:27:17
你想要的是multiple-value-bind还是nth-value,或者这个问题还有别的问题吗?
发布于 2013-08-28 02:49:14
您可以在Lisp端使用multiple-value-bind等将变量赋值给单独的变量,然后在Java端单独访问它们。或者,您可以从Java调用multiple-value-bind。这不是你要找的答案。我假设您真正想要的是一个可以在Java中调用的方法,它将直接获取第一个值以外的值。我没有这个答案,但没有其他人提供这个答案。
然而,浏览一下源代码和javadoc,我发现Primitives和Symbol类都有VALUES和MULTIPLE_VALUE_BIND方法。我猜它们不是被设计成在用户源代码中调用的,但它们至少可以帮助你找到你想要的答案。
最后,我认为这可能是您需要在ABCL邮件列表上询问的问题。你可以在这里报告完整的答案,作为你自己问题的答案。
发布于 2014-12-09 19:35:15
在调用返回多个值的函数之后,这些值将与正在执行的LispThread相关联,直到下一次调用Lisp。
用户可以通过调用getValues()将values对象作为LispObject实例的列表进行访问,如以下代码所示:
`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()); }`https://stackoverflow.com/questions/18455641
复制相似问题