2009-11-29 17 views
11

largo de la historia:código Lisp llamada desde Java

que estoy haciendo un proyecto para mi clase de programación funcional, y pensé en escribir un controlador de inteligencia artificial en Lisp, para la Mario AI competition.

Estuve revisando frameworks/libraries/formas de llamar al código Lisp desde Java, o incluso mejor la intercomunicación Lisp-Java.

He mirado Jacol, pero es viejo, y no compila bien para mí.

Mi mejor opción hasta ahora es: Jatha. Es realmente limpio, aunque algunos constructos de lisp aún no se han implementado, uno puede definir fácilmente sus propios constructos. Por ejemplo, mapcar y cond no están implementados. he implementado mi propia mapcar, llamado MAPP en Lisp como esto:

(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))) 

Ahora tienen una función simple que utiliza esto, por ejemplo, una función que los números de cuántos átomos hay en una lista

(defun myfunc (l) 
    (if (atom l) 
     '1 
     (apply '+ (mapp 'myfunc l)))) 

(myfunc '(6 2)) 

no lineal todo esto funciona bien en clisp ahora para llamar a código Lisp desde Java solía Jatha. Todo lo que hay que hacer es importar la biblioteca Jatha en el proyecto Java y cargar un archivo de Lisp como esto (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); 
    } 
} 

Mientras que el código funciona bien en clisp, y otras implementaciones, este código produce una 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

Así que mi pregunta es, ¿por qué lo hace? ¿Está mi código mal?
¿Es un error en Jatha? Compruébalo por ti mismo, no lleva mucho tiempo configurarlo.
¿Alguna vez has hecho algo similar?
¿Conoces alguna otra forma mejor de hacer esto? Todo lo que quiero es llamar desde Java algún código Lisp, ejecutarlo y recuperar los resultados calculados por el código Lisp.
Gracias.

[Editar] Se corrigió el código, pegó algo mal.

+1

En general, elija soluciones Java puras, no Java con llamadas al código nativo. Tu vida será más feliz :) En este caso, un LISP se ejecuta en el JVM. –

Respuesta

13

ABCL es una implementación de Common Lisp que se ejecuta directamente en la JVM - posiblemente es la mejor opción para ejecutar Common Lisp lado a lado con Java.

+1

Eso se ve bien, probándolo ahora –

+2

Esto funciona perfectamente y es lo que estaba buscando. Gracias Para cualquier persona que pueda encontrar este uso, estoy publicando un rápido [curso acelerado] (http://www.automatous-monk.com/jvmlanguages/abcl/Armed_Bear_Common_Lisp.html) que encontré. –

6

¿Has mirado en Clojure? Es un dialecto de Lisp que se ejecuta en la máquina virtual Java.

+3

... y http://java.dzone.com/tips/calling-clojure-java describe cómo llamar al código de Clojure desde Java. – itowlson

+0

Clojure se ve muy bien si encuentro que es compatible con Lisp, pero por el momento no puedo cargar incluso el ejemplo más simple, sigo obteniendo un 'Exception in thread" main "java.io.FileNotFoundException: Could not localizar recurso Clojure en classpath: X: \ t.clj ' y todo lo que tengo es:' RT.loadResourceScript ("X: \\ t.clj"); 'y el archivo está allí. –

+0

No importa, parece que si agrego el archivo en el directorio Clojure funciona bien. En la red se habla de editar el archivo pom.xml –

2

FOIL (Interfaz de objeto extraño para Lisp) proporciona medios para interactuar con los programas de Java y .NET.

Cuestiones relacionadas