Лисп-код вызывается из Java
Вопрос
Длинная история:
Я делаю проект для своего класса функционального программирования, и я подумал о написании контроллера AI на Лиспе для Марио AI соревнования .
Я просматривал фреймворки / библиотеки / способы вызова кода на Лиспе из Java или даже лучшего взаимодействия между Лисп-Java. Р>
Я смотрел на Jacol , но он старый и не подходит для меня. Р>
На данный момент мой лучший выбор: Джата . Это действительно аккуратно, хотя некоторые конструкции lisp еще не реализованы, можно легко определить его собственные конструкции. Например, mapcar и cond не реализованы. Я реализовал свой собственный mapcar с именем mapp в Лиспе следующим образом:
(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))
Все это прекрасно работает в клипе . Теперь для вызова кода на Лиспе из 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
<код> бежать: ПРИМЕНИТЬ: fn = +, args = ((1 1)) S: ((+ (Цитата 1) (Цитата 1))) Исключение в теме " main " java.lang.StackOverflowError at java.lang.Long.toString (Long.java:242) at 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 - это реализация Common Lisp, которая работает непосредственно в JVM - возможно, это лучший вариант для запуска Common Lisp бок о бок с Java.