说来话长:
我正在为我的函数编程类做一个项目,我想用Lisp为马里奥人工智能竞赛编写一个AI控制器。
我正在研究从Java调用Lisp代码的框架/库/方法,或者更好的Lisp交互。
我看过雅克尔,但它很旧,对我来说编译起来不太好。
到目前为止我最好的选择是:贾莎。虽然有些lisp结构还没有实现,但它确实很整洁,可以很容易地定义自己的构造。例如,映射器和cond没有实现。我在Lisp中实现了自己的mapcar,名为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)))现在,我有一个简单的函数,它使用这个函数,例如,一个计算非线性列表中有多少个原子的函数。
(defun myfunc (l)
(if (atom l)
'1
(apply '+ (mapp 'myfunc l))))
(myfunc '(6 2))在clisp中,这一切都很好,现在调用代码时,我使用了Jatha。所要做的就是导入java项目中的Jatha库,并加载如下(Ex)所示的lisp文件:
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);
}
}虽然该代码在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代码计算的结果。
谢谢。
编辑固定的代码,粘贴错误的东西。
发布于 2009-11-29 20:49:46
ABCL是一个直接在JVM中运行的Common实现--可能是与Java并行运行Common的最佳选择。
发布于 2009-11-29 19:57:31
你查过克洛尔了吗?这是在Java虚拟机上运行的Lisp方言。
发布于 2009-11-29 21:01:42
铝箔 ()提供了与Java和.NET程序交互的方法。
https://stackoverflow.com/questions/1816550
复制相似问题