Вопрос

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

Я делаю проект для своего класса функционального программирования, и я подумал о написании контроллера 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.

Другие советы

Посмотрели ли вы Clojure ? Это диалект Lisp, который работает на виртуальной машине Java.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top