从Java调用的Lisp代码

flo*_*nau 11 lisp java clisp jatha

很长的故事:

我正在为我的功能编程课做一个项目,我想在Lisp中编写一个AI控制器,用于Mario AI竞赛.

我正在研究从Java调用Lisp代码的框架/库/方法,甚至更好的Lisp-Java互通.

我看过Jacol,但它已经老了,而且对我来说编译不好.

到目前为止,我最好的选择是:Jatha.它真的很整洁,虽然一些lisp构造尚未实现,但可以轻松定义自己的构造.例如,mapcarcond未实现.我已经实现了自己的mapcar,在Lisp中命名为mapp,如下所示:

(defun map* (f l r) 
  (if (null l)
      r
      (map* f (rest l) (cons (funcall f (first l)) r))))

(defun mapp (f l)
    (reverse (map* f l nil)))
Run Code Online (Sandbox Code Playgroud)

现在我有一个使用它的简单函数,例如,一个函数,它计算非线性列表中有多少个原子

(defun myfunc (l)
  (if (atom l)
      '1
      (apply '+ (mapp 'myfunc l)))) 

(myfunc '(6 2))
Run Code Online (Sandbox Code Playgroud)

这一切在clisp中运行正常 现在从Java调用Lisp代码我使用了Jatha.所有人要做的就是在java项目中导入Jatha库并加载一个像这样的lisp文件(ex):

import org.jatha.*;
import org.jatha.dynatype.*;

public class Main {

    public static void main(String[] args) {
        Jatha lisp = new Jatha(false, false);
        lisp.init();
        lisp.start();
        LispValue file = lisp.makeString("X:\\lispproject\\test1.lisp");
        LispValue rez1 = lisp.load(file);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然该代码在clisp和其他实现中工作正常,但此代码会生成StackOverflow

run: APPLY: fn = +, args = ((1 1)) S: ((+ (QUOTE 1) (QUOTE 1))) Exception in thread "main" java.lang.StackOverflowError at java.lang.Long.toString(Long.java:242) at java.lang.Long.toString(Long.java:100) at java.lang.String.valueOf(String.java:2946) at org.jatha.dynatype.StandardLispInteger.toString(StandardLispInteger.java:113) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153) at org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152) at org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:17

所以我的问题是,它为什么这样做?我的代码错了吗?
这是Jatha的一个错误吗?亲眼看看,设置不需要很长时间.
你有没有做过类似的事情?
你知道其他更好的方法吗?我想要的是从Java调用一些Lisp代码,执行它,并获取由Lisp代码计算的结果.
谢谢.

[编辑]修复代码,粘贴错误.

Rai*_*wig 13

ABCL是一个直接在JVM中运行的Common Lisp实现 - 可能它是与Java并行运行Common Lisp的最佳选择.

  • 这很完美,也是我想要的.谢谢对于任何可能发现这个用途的人,我发布了一个快速[速成课程](http://www.automatous-monk.com/jvmlanguages/abcl/Armed_Bear_Common_Lisp.html). (2认同)

Joh*_*n Y 6

你看过Clojure了吗?它是在Java虚拟机上运行的Lisp方言.

  • ...和http://java.dzone.com/tips/calling-clojure-java描述了如何从Java调用Clojure代码. (3认同)
  • 可悲的是,它不是Lisp向后兼容的 (2认同)