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.
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. –