【问题标题】:Lisp code called from Java从 Java 调用的 Lisp 代码
【发布时间】:2010-12-21 10:53:33
【问题描述】:

长篇大论:

我正在为我的函数式编程课程做一个项目,我想用 Lisp 为 Mario AI competition 编写一个 AI 控制器。

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

我看过Jacol,但它很旧,对我来说编译不好。

到目前为止,我最好的选择是:Jatha。 确实很简洁,虽然一些 lisp 结构还没有实现,但可以很容易地定义自己的结构。例如 ma​​pcarcond 没有实现。 我已经实现了自己的 ma​​pcar,在 Lisp 中命名为 ma​​pp,如下所示:

(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

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 代码计算的结果。
谢谢。

[编辑] 修复代码,粘贴错误。

【问题讨论】:

  • 通常选择纯 Java 解决方案,而不是调用原生代码的 Java。你的生活会更快乐 :) 在这种情况下,运行在 JVM 上的 LISP。

标签: java lisp clisp jatha


【解决方案1】:

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

【讨论】:

  • 这很完美,正是我想要的。谢谢对于任何可能发现此用途的人,我正在快速发布crash course我发现。
【解决方案2】:

你看过Clojure吗?它是一种运行在 Java 虚拟机上的 Lisp 方言。

【讨论】:

  • ...和java.dzone.com/tips/calling-clojure-java 描述了如何从 Java 调用 Clojure 代码。
  • Clojure 看起来不错,如果我发现它与 Lisp 向后兼容,但目前我什至无法加载最简单的示例,我不断收到Exception in thread "main" java.io.FileNotFoundException: Could not locate Clojure resource on classpath: X:\t.clj ,我所拥有的只是: ` RT.loadResourceScript("X:\\t.clj");` 文件就在那里。
  • 没关系,如果我在 Clojure 目录中添加文件似乎可以正常工作。网上有一些关于编辑pom.xml文件的说法
  • 遗憾的是它不向后兼容 Lisp
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2013-12-03
    • 2018-09-27
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多