Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java获取ABCL中的值_Java_Lisp_Common Lisp_Abcl - Fatal编程技术网

如何使用Java获取ABCL中的值

如何使用Java获取ABCL中的值,java,lisp,common-lisp,abcl,Java,Lisp,Common Lisp,Abcl,我正在搜索API,以便使用Java在JVM中处理公共Lisp语言的公共Lisp(ABCL)实现中的值 当函数返回(仅)一个列表或字符串时,它起作用 当它返回multiple时,我只能获取第一个返回值 我不知道如何获取其他值 这是我的test.lisp文件: (defun get-list () (list "abc" 12 'a 'b)) (defun get-value () (values "abc" 12 'a 'b)) 我的Java代码是: public static

我正在搜索API,以便使用Java在JVM中处理公共Lisp语言的公共Lisp(ABCL)实现中的值

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

当它返回multiple时,我只能获取第一个返回值

我不知道如何获取其他值

这是我的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调用
多值绑定
。这不是你想要的答案。我假设您真正想要的是一个可以在Java中调用的方法,该方法将直接获取第一个以外的值。我没有这个答案,但没有其他人提供这个答案

然而,在源代码和javadoc中,我看到类
原语
符号
有方法
多值绑定
。我猜这些不是设计用来在用户源代码中调用的,但它们至少可以帮助您找到想要的答案


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

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

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


org.armedbear.lisp.Package cl=Packages.findPackage(“cl”);
符号值Symbol=cl.findAccessibleSymbol(“值”);
LispObject[]值args={
LispInteger.getInstance(1),
LispInteger.getInstance(2)
};
LispObject result=valuesSymbol.execute(valuesArgs);
LispObject[]值=LispThread.currentThread().getValues();
用于(LispObject值:值){
System.out.println(“value==>”+value.printObject());
}

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

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

有了这一点,它对我来说是有效的。

结束问题的原因之一是“关于您编写的代码问题的问题必须在问题本身中描述特定的问题,并包括重现问题的有效代码。有关指导,请参阅SSCCE.org。”你能展示一下你遇到麻烦的代码,以及你想做什么吗?正如一个答案已经指出的,如果这都是在Lisp端,那么它可能像
多值绑定一样简单,例如
(多值绑定(商余数)(3/2层)(列表商余数))=>(1/2)
。我认为现在提出结束问题的幽灵还为时过早。每个人在一开始提出问题时都会犯错误。(从历史上看,CL社区一直以对新手苛刻而著称,但SE没有。)mars表示同意;虽然我发布了结束原因的文本,但当时我没有投赞成票(还有黑文,因为给OP一些时间编辑是有意义的。几天过去了,OP没有编辑……怎么办long@Mars同意;我在复制结束文本时没有投反对票,因为我想给OP一些时间进行更新。已经过了几天,仍然没有更新。我还没有投反对票,但是除非最终有更多的细节,否则没有足够的信息来回答这个问题。我理解。这个人可能忙于工作或家庭生活,或者可能已经永远离开了。我认为savior想从Java的角度来做这件事——也就是说,他/她已经找到了如何用纯Java的方式访问第一个值的方法,并且也想做同样的事情当存在多个值时,可以使用其他值。但似乎他/她可以通过在Lisp中分配单独的变量来实现这一点,然后使用他/她已经使用的任何Java技术来获取这些变量的值。我同意@JoshuaTaylor的观点,即这将有助于了解已经完成的工作。