Domanda

Storia lunga:

Sto facendo un progetto per la mia classe di programmazione funzionale e ho pensato di scrivere un controller AI in Lisp, per Concorso Mario AI .

Stavo esaminando framework / librerie / modi per chiamare il codice Lisp da Java, o anche meglio l'intercomunicazione Lisp-Java.

Ho guardato Jacol , ma è vecchio e non si compila bene per me.

La mia scelta migliore finora è: Jatha . È davvero pulito, anche se alcuni costrutti lisp non sono ancora implementati, si possono facilmente definire i propri costrutti. Ad esempio mapcar e cond non sono implementati. Ho implementato il mio mapcar , chiamato mapp in Lisp in questo modo:

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

Ora ho una semplice funzione che utilizza questa, ad esempio una funzione che numera il numero di atomi presenti in un elenco non lineare

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

(myfunc '(6 2))

Tutto funziona bene in clisp Ora per chiamare il codice Lisp da Java ho usato Jatha . Tutto quello che bisogna fare è importare la libreria Jatha nel progetto java e caricare un file lisp come questo (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);
    }
}

Mentre quel codice funziona bene in clisp e altre implementazioni, questo codice produce uno StackOverflow

correre: APPLICA: fn = +, args = ((1 1)) S: ((+ (QUOTE 1) (QUOTE 1))) Eccezione nel thread "principale" 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)         a

È stato utile?

Soluzione

ABCL è un'implementazione di Lisp comune che viene eseguita direttamente nella JVM - probabilmente è la l'opzione migliore per eseguire Common Lisp fianco a fianco con Java.

Altri suggerimenti

Hai esaminato Clojure ? È un dialetto Lisp che gira su Java Virtual Machine.

FOIL (Foreign Object Interface for Lisp) fornisce mezzi per interagire con i programmi Java e .NET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top