2009-11-29 5 views
11

Длинная история: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.
Спасибо.

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

+1

В общем, для чистых решений Java, а не для Java с вызовами собственного кода. Ваша жизнь будет счастливее :) В этом случае LISP работает на JVM. –

ответ

13

ABCL является общей реализацией Lisp, которая запускается непосредственно в JVM - возможно, это лучший вариант для запуска Common Lisp рядом с Java.

+1

Это выглядит хорошо, теперь попробуйте –

+2

Это работает отлично и именно то, что я искал. Спасибо Для тех, кто может это использовать, я отправляю быстрый [круговой курс] (http://www.automatous-monk.com/jvmlanguages/abcl/Armed_Bear_Common_Lisp.html), который я нашел. –

6

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

+3

... и http://java.dzone.com/tips/calling-clojure-java описывает, как вызвать код Clojure с Java. – itowlson

+0

Clojure выглядит неплохо, если я обнаруживаю, что он совместим с Lisp, но на данный момент я не могу загрузить даже самый простой пример, я продолжаю получать «Исключение в потоке» main «java.io.FileNotFoundException: не удалось найдите ресурс Clojure в пути к классам: X: \ t.clj ' и все, что у меня есть:' RT.loadResourceScript ("X: \\ t.clj"); 'и файл есть. –

+0

Nevermind, кажется, что если я добавлю файл в каталог Clojure, он отлично работает. В сети есть некоторые разговоры о редактировании файла pom.xml –

2

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

Смежные вопросы