首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java调用的Lisp代码

从Java调用的Lisp代码
EN

Stack Overflow用户
提问于 2009-11-29 19:48:56
回答 3查看 4.7K关注 0票数 11

说来话长:

我正在为我的函数编程类做一个项目,我想用Lisp为马里奥人工智能竞赛编写一个AI控制器。

我正在研究从Java调用Lisp代码的框架/库/方法,或者更好的Lisp交互。

我看过雅克尔,但它很旧,对我来说编译起来不太好。

到目前为止我最好的选择是:贾莎。虽然有些lisp结构还没有实现,但它确实很整洁,可以很容易地定义自己的构造。例如,映射器cond没有实现。我在Lisp中实现了自己的mapcar,名为mapp,如下所示:

代码语言:javascript
复制
(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)))

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

代码语言:javascript
复制
(defun myfunc (l)
  (if (atom l)
      '1
      (apply '+ (mapp 'myfunc l)))) 

(myfunc '(6 2))

clisp中,这一切都很好,现在调用代码时,我使用了Jatha。所要做的就是导入java项目中的Jatha库,并加载如下(Ex)所示的lisp文件:

代码语言:javascript
复制
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代码计算的结果。

谢谢。

编辑固定的代码,粘贴错误的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-29 20:49:46

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

票数 13
EN

Stack Overflow用户

发布于 2009-11-29 19:57:31

你查过克洛尔了吗?这是在Java虚拟机上运行的Lisp方言。

票数 6
EN

Stack Overflow用户

发布于 2009-11-29 21:01:42

铝箔 ()提供了与Java和.NET程序交互的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1816550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档