clojure / scala interop? - PullRequest
       11

clojure / scala interop?

6 голосов
/ 19 декабря 2010

Я пытаюсь подключиться к этому простому скала-коду, но у меня возникли некоторые проблемы.

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)
  }    
}

В ближайшем будущем я делаю это

(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

Кроме того, я не получаю вывод на консоль! Тестирование этого кода с использованием Scala работает как положено. Что здесь происходит и как я могу это исправить, чтобы clojure мог использовать код scala?

1 Ответ

9 голосов
/ 19 декабря 2010

Попробуйте это в REPL:

(class b) вероятно скажет вам, что это indicators.DoubleRingBuffer.

(vec (.getDeclaredMethods (class b))) даст вам вектор всех методов, объявленных в вашем классе, как если бы это был класс Java, чтобы вы могли видеть их сигнатуры.

Теперь вызовите ваши методы, как видно из сигнатур, с этими именами и параметрами методов.

У меня такое чувство, что проблема в том, что Scala работает со значением по умолчанию для параметра метода.

РЕДАКТИРОВАТЬ: как описано в комментарии OP, это не так.

Если это не сработает, вы можете попробовать декомпилировать свой байт-код Scala в Java, чтобы узнать, как выглядит класс DoubleRingBuffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...