lisp java_从Java调用的LISP代码

本文讲述了作者在为函数编程课程做项目时,尝试用Lisp编写Mario AI并从Java调用LISP代码的过程。作者提到了使用Jatha框架遇到的StackOverflowError问题,并提供了简化后的Lisp代码示例。文章询问了可能的原因,是否为Jatha的bug,并寻求其他从Java调用LISP代码的方法。
摘要由CSDN通过智能技术生成

长篇小说:

我正在为我的函数编程类做一个项目,我想到在Lisp中为

Mario AI competition

.

我正在研究从Java调用LISP代码的框架/库/方式,甚至更好的LISP Java互通信。

我看过

Jacol

但它是旧的,对我来说也不是很好。

到目前为止,我的最佳选择是:

Jatha

.

它真的很整洁,虽然一些Lisp构造还没有实现,但是可以很容易地定义自己的构造。例如

地图车

康德

未实现。

我已经实现了我自己的

地图车

命名

马普

像这样的Lisp:

(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))

这一切在

CLSIP

现在从Java中调用LISP代码

贾萨

. 所有人必须做的就是在Java项目中导入JATA库,然后加载一个像这样的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);

}

}

虽然该代码在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

所以我的问题是,为什么要这样做?我的密码错了吗?

这是贾莎的虫子吗?你自己看看,不需要很长时间就可以设置。

你做过类似的事情吗?

你知道其他更好的方法吗?我只想从Java调用一些LISP代码,使其被执行,并返回由LISP代码计算的结果。

谢谢。

[编辑]修复了代码,粘贴了错误的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值