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