2013-02-12 120 views
2

我完全不熟悉Java和clojure。但以往在共同的lisp方面的經驗,我想我會試試clojure。我無法弄清楚一些非常基本的東西。無法從Clojure調用實例方法。

這是實際的Java代碼。

import syntaxtree.*; 
import visitor.*; 

public class Main { 
    public static void main(String [] args) { 
    try { 
     Node root = new MicroJavaParser(System.in).Goal(); 
     System.out.println("Program parsed successfully"); 
    } 
    catch (ParseException e) { 
     System.out.println(e.toString()); 
    } 
    } 
} 

當我運行此代碼時,結果如預期。

└──╼ java Main < ../input/Factorial.java 
Program parsed successfully 

在Clojure中我嘗試這樣做:

(ns clj-assign2.core) 

(defn -main 
    [] 
    (def root 
    (.Goal 
    (MicroJavaParser. (. System in)))) 
    (println "Successfully parsed")) 

但是這段代碼運行時,以下異常引發:

└──╼ lein run < ../assign2/input/Factorial.java 
Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: Goal for class MicroJavaParser 
    at clojure.lang.Reflector.getInstanceField(Reflector.java:271) 
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:300) 
    at clj_assign2.core$_main.invoke(core.clj:7) 
< --- snipped --- > 

我在做什麼錯在這裏?

+0

目標方法的簽名是什麼? – user100464 2013-02-12 18:47:56

+0

目標方法的可見性是什麼? – Alex 2013-02-12 19:16:46

+0

無法從您發佈的內容中分辨出來。也許,目標是可變的,這可能會導致這種情況。嘗試使用反射在MicroJavaParser中打印出所有方法,嘗試打印出getClass的輸出。或者試着讓它在java.lang中的類上工作,以便其他人可以嘗試你的代碼。順便說一句,在這樣的defn中使用def通常不是一個好主意! – 2013-02-13 10:51:36

回答

1

也許你錯過了clojure程序中的導入語句?