clojure / scala interop?

6

Я пытаюсь вмешаться в этот простой код scala, но у меня есть некоторые проблемы.

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

В clojure, я делаю это

(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?

Теги:
clojure

1 ответ

9
Лучший ответ

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

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

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

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

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

EDIT: как описано в комментарии, OP это не так.

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

  • 0
    Спасибо! Декомпиляция сделала свое дело - java-код был идеальным, так что в итоге это была какая-то странная ошибка с моим инкрементным инструментом сборки - перезапустилась и все заработало как положено! Кстати, я использовал java.decompiler.free.fr , отличный инструмент.
  • 1
    @josh: Вы также можете попробовать scalac -print который выведет «десагаредную» версию, которая по-прежнему остается синтаксисом Scala, но изоморфна Java, т. е. со всеми удаленными расширенными функциями Scala. Также есть scalap который работает как javap , то есть декомпилирует .class .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню