首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java获取ABCL中的值

如何使用Java获取ABCL中的值
EN

Stack Overflow用户
提问于 2013-08-27 09:43:09
回答 4查看 437关注 0票数 3

我正在使用Java在JVM中搜索用于处理通用Lisp语言的武装熊通用Lisp (ABCL)实现中的值的API。

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

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

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

这是我的test.lisp文件:

代码语言:javascript
复制
(defun get-list ()
   (list "abc" 12 'a 'b))

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

我的Java代码是:

代码语言:javascript
复制
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();

}
EN

回答 4

Stack Overflow用户

发布于 2013-08-27 20:27:17

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

票数 2
EN

Stack Overflow用户

发布于 2013-08-28 02:49:14

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

然而,浏览一下源代码和javadoc,我发现PrimitivesSymbol类都有VALUESMULTIPLE_VALUE_BIND方法。我猜它们不是被设计成在用户源代码中调用的,但它们至少可以帮助你找到你想要的答案。

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

票数 0
EN

Stack Overflow用户

发布于 2014-12-09 19:35:15

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

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

代码语言:javascript
复制
 `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());     }`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18455641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档