flo*_*nau 11 lisp java clisp jatha
很长的故事:
我正在为我的功能编程课做一个项目,我想在Lisp中编写一个AI控制器,用于Mario AI竞赛.
我正在研究从Java调用Lisp代码的框架/库/方法,甚至更好的Lisp-Java互通.
我看过Jacol,但它已经老了,而且对我来说编译不好.
到目前为止,我最好的选择是:Jatha.它真的很整洁,虽然一些lisp构造尚未实现,但可以轻松定义自己的构造.例如,mapcar和cond未实现.我已经实现了自己的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代码计算的结果.
谢谢.
[编辑]修复代码,粘贴错误.