2010-12-19 9 views
6

Próbuję przejść do tego prostego kodu scala, ale mam pewne problemy.clojure/scala interop?

package indicators 

class DoubleRingBuffer(val capacity:Int=1000) { 
    var elements = new Array[Double](capacity); 
    private var head=capacity-1 
    private var max=0 

    def size():Int = { 
    return max+1 
    } 

    def add(obj:Double):Double = { 
    head-=1 
    if (head<0) head=capacity-1 
    return set(max+1,obj) 
    } 

    def set(i:Int,obj:Double):Double = { 
    System.out.println("HI") 
    if (i>=capacity || i<0) 
     throw new IndexOutOfBoundsException(i+" out of bounds") 
    if (i>=max) max=i 
    var index = (head+i)%capacity 
    var prev = elements(index) 
    elements(index)=obj 
    return prev 
    } 

    def get(i:Int=0):Double = { 
    System.out.println("size is "+size()) 
    if (i>=size() || i<0) 
     throw new IndexOutOfBoundsException(i+" out of bounds") 
    var index = (head+i)%capacity 
    return elements(index) 
    }  
} 

W Clojure, robię to

(import 'indicators.DoubleRingBuffer) 
(def b (DoubleRingBuffer. 100)) 
(pr (.size b)) ;;ERROR: No matching field found: size for class indicators.DoubleRingBuffer 
(pr (.get b 33)) ;;returns 0: should throw an index out of bounds error! 
(pr (.get b 100)) ;;throws index out of bounds error, as it should 

Ponadto ja nie dostać żadnego wyjścia do konsoli! Testowanie tego kodu za pomocą scala działa zgodnie z oczekiwaniami. Co tu się dzieje i jak mogę to naprawić, aby clojure mógł używać kodu scala?

Odpowiedz

9

Spróbuj je w REPL:

(class b) pewnie powie, że to indicators.DoubleRingBuffer.

(vec (.getDeclaredMethods (class b))) poda wektor wszystkich metod zadeklarowanych w twojej klasie tak, jakby był klasą Java, dzięki czemu możesz zobaczyć ich podpisy.

Teraz wywołaj swoje metody, jak widać w podpisach, za pomocą nazw i parametrów tych metod.

Mam przeczucie, że problem polega na tym, że Scala radzi sobie z wartością domyślną dla parametru metody.

EDYCJA: OP opisane w komentarzu, nie jest.

Jeśli to nie zadziała, możesz spróbować zdekompilować kod bajtowy Scala do Javy, aby dowiedzieć się, jak wygląda klasa DoubleRingBuffer.

+0

Dzięki! Dekompilacja zrobiła kawał - kod Java był doskonały, więc w końcu był to dziwny błąd z moim inkrementalnym narzędziem do kompilacji - zrestartowany i działał zgodnie z oczekiwaniami! btw, użyłem http://java.decompiler.free.fr/, świetne narzędzie. – josh

+1

@josh: Możesz także wypróbować 'scalac -print', który wydrukuje wersję" desugared ", która jest nadal składnią Scala, ale jest izomorficzna z Javą, tj. Z usuniętymi wszystkimi zaawansowanymi funkcjami Scali. Istnieje również 'scalap', który działa jak' javap', tzn. Dekompiluje pliki '.class'. –

+0

@josh: Cieszę się, że to działa! –