質問
長編:
関数型プログラミングクラスのプロジェクトを行っています。マリオAIコンテスト。
私は、JavaからLispコードを呼び出すフレームワーク/ライブラリ/方法、またはさらに優れたLisp-Java相互通信を探していました。
Jacol を確認しましたが、古いものであり、コンパイルはうまくいきません。
これまでの最善の選択は、 Jatha です。 いくつかのLispコンストラクトはまだ実装されていませんが、自分のコンストラクトを簡単に定義できます。たとえば、 mapcar と cond は実装されていません。 次のように、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 を使用しました。行う必要があるのは、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)
java.lang.String.valueOf(String.java:2946)
org.jatha.dynatype.StandardLispInteger.toString(StandardLispInteger.java:113)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
org.jatha.dynatype.StandardLispCons.toStringAsCdr_internal(StandardLispCons.java:174)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:153)で
org.jatha.dynatype.StandardLispCons.toString(StandardLispCons.java:152)
で
解決
ABCL は、JVMで直接実行されるCommon Lisp実装です。 Common LispをJavaと並行して実行するための最良のオプション。