如何使用Java获取ABCL中的值

时间:2013-08-27 01:43:09

标签: java lisp common-lisp abcl

我正在使用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();

}

4 个答案:

答案 0 :(得分:2)

您正在寻找multiple-value-bindnth-value,还是还有其他问题?

答案 1 :(得分:0)

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

然而,在源代码和javadoc中,我看到类PrimitivesSymbol有方法VALUESMULTIPLE_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)

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

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

有了它,它对我有用。