长篇故事:

我正在为我的功能编程类做一个项目,我想在Lisp中编写一个AI控制器,用于马里奥AI竞赛

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

我已经查看了 Jacol ,但它已经过时了,而且我编译也不错。

到目前为止,我最好的选择是: Jatha 。 它真的很整洁,虽然一些lisp构造尚未实现,但可以轻松定义自己的构造。例如, mapcar 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 中正常使用 现在从Java调用Lisp代码我使用 Jatha 。所有人要做的就是在java项目中导入Jatha库并加载像这样的(例如)的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

<代码> 跑: 申请:fn = +,args =((1 1)) S :((+(QUOTE 1)(QUOTE 1))) 线程“main”中的异常java.lang.StackOverflowError的         在java.lang.Long.toString(Long.java:242)         在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)         在

有帮助吗?

解决方案

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

其他提示

您是否考虑过 Clojure ?它是在Java虚拟机上运行的Lisp方言。

FOIL (Lisp的外部对象接口)提供了与Java和.NET程序交互的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top