Длинная история:Lisp код вызывается из Java
Я делаю проект для моего функционального класса программирует, и я думал о написании контроллера AI в Лиспе для Mario AI competition.
Я искал фреймворки/библиотеки/способы вызова кода Lisp с Java или даже лучшего взаимодействия Lisp-Java.
Я посмотрел Jacol, но он старый, и он не компилируется для меня.
Мой лучший выбор до сих пор: Jatha. Это действительно опрятно, хотя некоторые lisp-конструкции еще не реализованы, можно легко определить его собственные конструкции. Например, mapcar и cond не применяются. я реализовал свой собственный 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 Теперь позвонить 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
Так что мой вопрос, почему он это делает? Является ли мой код неправильным?
Это ошибка в Jatha? Посмотрите сами, это не займет много времени, чтобы настроить.
Вы когда-нибудь делали что-то подобное?
Знаете ли вы какие-нибудь другие способы? Все, что я хочу, - это вызвать из Java некоторый код Lisp, выполнить его и вернуть результаты, рассчитанные кодом Lisp.
Спасибо.
[Изменить] Исправлен код, вставленный что-то не так.
В общем, для чистых решений Java, а не для Java с вызовами собственного кода. Ваша жизнь будет счастливее :) В этом случае LISP работает на JVM. –