11

長い話:

私は関数型プログラミング クラスのプロジェクトを行っており、Mario AI コンペティションのために、Lisp で AI コントローラーを作成することを考えました。

フレームワーク/ライブラリ/Java から Lisp コードを呼び出す方法、またはさらに優れた Lisp-Java 相互通信について調べていました。

私はJacolを見てきましたが、それは古く、うまくコンパイルできません。

これまでのところ、私の最良の選択は: Jathaです。いくつかの Lisp コンストラクトはまだ実装されていませんが、独自のコンストラクトを簡単に定義できます。たとえば、mapcarcondは実装されていません。次のように Lisp でmappという名前の独自のmapcarを実装しました。

(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を使用しました。Jatha ライブラリを Java プロジェクトにインポートし、次のような 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 コードによって計算された結果を取得することだけです。
ありがとう。

[編集] コードを修正し、間違ったものを貼り付けました。

4

3 に答える 3

13

ABCLは、JVM で直接実行される Common Lisp の実装です。おそらく、Common Lisp を Java と並行して実行するのに最適なオプションです。

于 2009-11-29T20:49:46.627 に答える
6

Clojureを調べましたか?これは Java 仮想マシン上で動作する Lisp 方言です。

于 2009-11-29T19:57:31.553 に答える
2

FOIL (Foreign Object Interface for Lisp) は、Java および .NET プログラムと対話する手段を提供します。

于 2009-11-29T21:01:42.773 に答える