Lisp код, вызываемый из Java

Длинная история:

Я делаю проект для своего функционального программирующего класса, и я подумал о написании контроллера AI в Lisp, для конкурса Mario AI.

Я искал фреймворки/библиотеки/способы вызова Lisp кода с Java или даже лучшего Lisp -Java-взаимодействия.

Я просмотрел Jacol, но он старый, и он не компилируется для меня отлично.

Мой лучший выбор до сих пор: Jatha. Это действительно опрятно, хотя некоторые конструкторы Lisp еще не реализованы, можно легко определить его собственные конструкции. Например, mapcar и cond не реализованы. Я применил свой собственный mapcar, названный mapp в 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))

Все это прекрасно работает в clisp Теперь для вызова кода Lisp из Java я использовал Jatha. Все, что нужно сделать, это импортировать библиотеку Jatha в проект java и загрузить файл 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.
Спасибо.

[Изменить] Исправлен код, вставлял что-то не так.

Ответ 1

ABCL является общей реализацией Lisp, которая запускается непосредственно в JVM - возможно, это лучший вариант для запуска Common Lisp side рядом с Java.

Ответ 2

Вы заглянули в Clojure? Это диалект Lisp, который запускается на виртуальной машине Java.

Ответ 3

FOIL (интерфейс внешнего объекта для Lisp) предоставляет средства для взаимодействия с Java и .NET-программами.