문제

긴 이야기:

기능 프로그램 클래스를위한 프로젝트를 수행하고 있으며 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를 나란히 실행하는 것이 가장 좋습니다.

다른 팁

당신은 조사 했습니까? Clojure? Java Virtual Machine에서 실행되는 LISP 방언입니다.

(LISP 용 외국 객체 인터페이스)는 Java 및 .NET 프로그램과 상호 작용하는 수단을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top