2009-11-29 8 views
11
से कहा जाता

लंबी कहानी:लिस्प कोड जावा

मैं अपने कार्यात्मक कार्यक्रमों की कक्षा के लिए एक परियोजना कर रहा हूँ, और मैं Mario AI competition के लिए, लिस्प में एक ऐ नियंत्रक लेखन के बारे में सोचा।

मैं फ्रेमवर्क/पुस्तकालयों/जावा से लिस्प कोड को कॉल करने के तरीके, या यहां तक ​​कि बेहतर लिस्प-जावा इंटरक्यूनिकेशन को देख रहा था।

मैंने Jacol पर देखा है, लेकिन यह पुराना है, और यह मेरे लिए ठीक संकलित नहीं करता है।

मेरी सबसे अच्छी पसंद अब तक है: Jatha। यह वास्तव में साफ है, हालांकि कुछ लिस्प संरचनाएं अभी तक कार्यान्वित नहीं की गई हैं, कोई आसानी से अपनी संरचनाओं को परिभाषित कर सकता है। उदाहरण के लिए मैपरकार और cond लागू नहीं किए गए हैं।

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

अब मैं एक साधारण समारोह उदाहरण के लिए इस का उपयोग करता है, है, एक समारोह है कि संख्या कितने परमाणुओं एक में देखते हैं: मैं अपने खुद के mapcar, MAPP लिस्प में इस तरह नामित लागू कर दिया है गैर रेखीय सूची

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

(myfunc '(6 2)) 

यह सब clisp में ठीक काम करता है अब जावा मैं इस्तेमाल किया जत्था से लिस्प कोड कॉल करने के लिए। सभी एक करना है जावा परियोजना में जत्था पुस्तकालय आयात और इस तरह एक तुतलाना फ़ाइल (पूर्व) लोड है:

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

तो मेरा सवाल यह है कि यह ऐसा क्यों करता है? क्या मेरा कोड गलत है?
क्या यह जाथा में एक बग है? अपने लिए देखें, इसे स्थापित करने में लंबा समय नहीं लगता है।
क्या आपने कभी ऐसा कुछ किया है?
क्या आप इसे करने के लिए किसी अन्य बेहतर तरीके से जानते हैं? मैं चाहता हूं कि जावा से कुछ लिस्प कोड को कॉल करें, इसे निष्पादित करें, और लिस्प कोड द्वारा गणना किए गए परिणामों को वापस प्राप्त करें।
धन्यवाद।

[संपादित करें] फिक्स्ड कोड, कुछ गलत चिपकाया।

+1

आम तौर पर शुद्ध जावा समाधान के लिए जाएं, जावा नहीं, देशी कोड पर कॉल के साथ। आपका जीवन खुश होगा :) इस मामले में, एक LISP जेवीएम पर चल रहा है। –

उत्तर

13

ABCL एक सामान्य लिस्प कार्यान्वयन है जो सीधे जेवीएम में चलता है - संभवतया यह जावा के साथ आम लिस्प पक्ष को चलाने का सबसे अच्छा विकल्प है।

+1

यह ठीक दिखता है, अब इसे आजमा रहा है –

+2

यह पूरी तरह से काम करता है और जो मैं ढूंढ रहा था। धन्यवाद किसी भी व्यक्ति के लिए जो इसका उपयोग पा सकता है, मैं एक त्वरित [क्रैश कोर्स] पोस्ट कर रहा हूं (http://www.automatous-monk.com/jvmlanguages/abcl/Armed_Bear_Common_Lisp.html) मैंने पाया। –

6

क्या आपने Clojure देखा है? यह एक लिस्प बोली है जो जावा वर्चुअल मशीन पर चलती है।

+3

... और http://java.dzone.com/tips/calling-clojure-java जावा से क्लोजर कोड को कॉल करने का वर्णन करता है। – itowlson

+0

क्लोजर अच्छा दिखता है अगर मुझे लगता है कि यह लिस्प के साथ असंगत है, लेकिन इस पल के लिए मैं सबसे सरल उदाहरण भी लोड नहीं कर सकता, मैं मुख्य रूप से 'थ्रेड में अपवाद "प्राप्त करता रहता हूं" java.io.FileNotFoundException: नहीं कर सका क्लासपाथ पर क्लोजर संसाधन का पता लगाएं: एक्स: \ t.clj ' और मेरे पास यह सब है:' RT.loadResourceScript ("X: \\ t.clj"); 'और फ़ाइल वहां है। –

+0

कभी नहीं, ऐसा लगता है कि अगर मैं क्लोजर निर्देशिका में फ़ाइल जोड़ता हूं तो ठीक काम करता है। Pom.xml फ़ाइल को संपादित करने के बारे में नेट पर कुछ बात है –

2

FOIL (लिस्प के लिए विदेशी ऑब्जेक्ट इंटरफेस) जावा और .NET प्रोग्राम के साथ बातचीत करने का माध्यम प्रदान करता है।