लंबी कहानी:लिस्प कोड जावा
मैं अपने कार्यात्मक कार्यक्रमों की कक्षा के लिए एक परियोजना कर रहा हूँ, और मैं 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
तो मेरा सवाल यह है कि यह ऐसा क्यों करता है? क्या मेरा कोड गलत है?
क्या यह जाथा में एक बग है? अपने लिए देखें, इसे स्थापित करने में लंबा समय नहीं लगता है।
क्या आपने कभी ऐसा कुछ किया है?
क्या आप इसे करने के लिए किसी अन्य बेहतर तरीके से जानते हैं? मैं चाहता हूं कि जावा से कुछ लिस्प कोड को कॉल करें, इसे निष्पादित करें, और लिस्प कोड द्वारा गणना किए गए परिणामों को वापस प्राप्त करें।
धन्यवाद।
[संपादित करें] फिक्स्ड कोड, कुछ गलत चिपकाया।
आम तौर पर शुद्ध जावा समाधान के लिए जाएं, जावा नहीं, देशी कोड पर कॉल के साथ। आपका जीवन खुश होगा :) इस मामले में, एक LISP जेवीएम पर चल रहा है। –