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?
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
@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'. –
@josh: ¡me alegra oír que funciona! –