LISP 코드는 Java에서 호출되었습니다
문제
긴 이야기:
기능 프로그램 클래스를위한 프로젝트를 수행하고 있으며 LISP에서 AI 컨트롤러를 작성하는 것을 생각했습니다. 마리오 AI 경쟁.
나는 Java에서 LISP 코드를 호출하는 프레임 워크/라이브러리/방법을 살펴 보거나 더 나은 LISP-Java Intermunication을보고있었습니다.
나는 보았다 자코, 그러나 그것은 오래되었고, 그것은 나를 위해 잘 컴파일하지 않습니다.
지금까지 나의 최선의 선택은 다음과 같습니다. 자타. 일부 LISP 구성은 아직 구현되지 않았지만 자신의 구성을 쉽게 정의 할 수 있지만 실제로는 깔끔합니다. 예를 들어 MAPCAR 그리고 조건 구현되지 않았습니다. 나는 내 자신을 구현했다 MAPCAR, 명명 된 맵 다음과 같은 LISP에서 :
(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)))
이제 이것을 사용하는 간단한 기능이 있습니다. 예를 들어, 비선형 목록에있는 원자 수를 숫자로하는 함수
(defun myfunc (l)
(if (atom l)
'1
(apply '+ (mapp 'myfunc l))))
(myfunc '(6 2))
이것은 모두 잘 작동합니다 Clisp이제 내가 사용한 Java에서 LISP 코드를 호출합니다 자타. 해야 할 일은 Java 프로젝트에서 Jatha Library를 가져오고 다음과 같은 LISP 파일을로드하는 것입니다.
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
그래서 내 질문은 왜 이렇게합니까? 내 코드가 잘못 되었습니까?
Jatha의 버그입니까? 직접 보면 설정하는 데 오래 걸리지 않습니다.
비슷한 일을 한 적이 있습니까?
이 작업을 수행하는 다른 방법을 알고 있습니까? 내가 원하는 것은 Java에서 일부 LISP 코드를 호출하고 실행하고 LISP 코드에 의해 계산 된 결과를 얻는 것입니다.
감사.
편집] 고정 코드, 뭔가 잘못된 것을 붙여 넣었습니다.
해결책
abcl JVM에서 직접 실행되는 일반적인 LISP 구현입니다. 아마도 Java와 함께 일반적인 LISP를 나란히 실행하는 것이 가장 좋습니다.