2010-12-19 8 views
6

Estoy intentando interoperar con este código Scala simple, pero estoy teniendo algunos problemas.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) 
    }  
} 

En clojure, hago esto

(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 

Además, no recibo ninguna salida a la consola! Probar este código usando Scala funciona como se espera. ¿Qué está pasando aquí y cómo puedo solucionarlo para que clojure pueda usar el código scala?

Respuesta

9

Pruebe estos en REPL:

(class b) probablemente le dirá que es indicators.DoubleRingBuffer.

(vec (.getDeclaredMethods (class b))) le dará un vector de todos los métodos declarados en su clase como si fuera una clase de Java, para que pueda ver sus firmas.

Ahora, llame a sus métodos como se ve en las firmas, con estos nombres y parámetros de método.

Tengo la sensación de que Scala se enfrenta al valor predeterminado del parámetro de método.

EDITAR: Como OP se describe en un comentario, no lo es.

Si eso no funciona, puede intentar descompilar su código de bytes Scala en Java para averiguar cómo es la clase DoubleRingBuffer.

+0

Gracias! Descompilar hizo el truco - el código de Java era perfecto, así que al final fue un extraño error con mi herramienta de construcción incremental - ¡reinició y funcionó como se esperaba! Por cierto, utilicé http://java.decompiler.free.fr/, gran herramienta. – josh

+1

@josh: también puede probar 'scalac -print' que imprimirá una versión" desaleatorizada "que sigue siendo la sintaxis de Scala, pero isomórfica para Java, es decir, con todas las características avanzadas de Scala eliminadas. Además, hay 'scalap' que funciona como' javap', es decir, descompila archivos '.class'. –

+0

@josh: ¡me alegra oír que funciona! –