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

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

Я делаю проект для своего класса функционального программирования и подумал о написании контроллера ИИ на Лиспе для ИИ Марио. конкурс.

Я просматривал фреймворки/библиотеки/способы вызова кода 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 некоторый код Лиспа, выполнить его и получить результаты, вычисленные кодом Лиспа.
Спасибо.

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


person florin.bunau    schedule 29.11.2009    source источник
comment
Обычно выбирают чистые решения Java, а не Java с вызовами собственного кода. Ваша жизнь станет счастливее :) В данном случае LISP работает на JVM.   -  person Thorbjørn Ravn Andersen    schedule 30.11.2009


Ответы (3)


ABCL — это реализация Common Lisp, которая работает непосредственно в JVM. запускать Common Lisp вместе с Java.

person Rainer Joswig    schedule 29.11.2009
comment
Это работает отлично, и это то, что я искал. Спасибо Всем, кому это может пригодиться, я публикую краткий ускоренный курс я нашел. - person florin.bunau; 30.11.2009

Вы изучали Clojure? Это диалект Лиспа, работающий на виртуальной машине Java.

person John Y    schedule 29.11.2009
comment
...и java.dzone.com/tips/calling-clojure-java описывает, как вызывать код Clojure из Java. - person itowlson; 29.11.2009
comment
Clojure выглядит довольно хорошо, если я обнаружу, что он обратно совместим с Lisp, но на данный момент я не могу загрузить даже самый простой пример, я продолжаю получать Exception in thread "main" java.io.FileNotFoundException: Could not locate Clojure resource on classpath: X:\t.clj , и все, что у меня есть, это: `RT.loadResourceScript(X:\\ t.clj);` и файл есть. - person florin.bunau; 29.11.2009
comment
Неважно, кажется, что если я добавлю файл в каталог Clojure, он будет работать нормально. В сети есть разговоры о редактировании файла pom.xml. - person florin.bunau; 29.11.2009
comment
К сожалению, он не имеет обратной совместимости с Лиспом. - person florin.bunau; 29.11.2009

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

person dmitry_vk    schedule 29.11.2009