Как объявить перечисления Java в собственных объявлениях Frege?

При использовании инструмента Frege native-gen в классе JavaFX Animation он генерирует код Frege, который включает в себя следующее:

data Animation = mutable native javafx.animation.Animation where
  native getRate   :: Animation -> IO Double
  native getStatus :: Animation -> IO Animation_Status

но код не компилируется, так как отсутствует тип Animation_Status. На стороне Java это перечисление. http://docs.oracle.com/javafx/2/api/javafx/animation/Animation.Status.html

Каков рекомендуемый способ обработки этого в собственном объявлении?


person Dierk    schedule 17.08.2015    source источник
comment
Что он делает, когда вы запускаете его на Animation.Status?   -  person Ingo    schedule 17.08.2015
comment
Ну, перечисление содержится, поэтому я не могу запустить на нем генератор.   -  person Dierk    schedule 18.08.2015
comment
Это все еще должно быть возможно, независимо от того, является ли оно вложенным.   -  person Ingo    schedule 18.08.2015


Ответы (1)


Мы можем сгенерировать код Фреге для внутренних классов. Имя класса, которое вводится в инструмент собственного поколения, — это имя, возвращаемое Class.getName. Для перечисления Animation.Status это javafx.animation.Animation$Status.

$ java -jar native-gen-1.0-SNAPSHOT.jar 

Enter class name: javafx.animation.Animation$Status

data Animation_Status = pure native javafx.animation.Animation.Status where

  pure native paused "javafx.animation.Animation.Status.PAUSED" :: Animation_Status
  pure native running "javafx.animation.Animation.Status.RUNNING" :: Animation_Status
  pure native stopped "javafx.animation.Animation.Status.STOPPED" :: Animation_Status

  pure native valueOf "javafx.animation.Animation.Status.valueOf" :: String -> Animation_Status

  native values "javafx.animation.Animation.Status.values" :: () -> STMutable s (JArray Animation_Status)

derive Serializable Animation_Status

Кстати, версия native-gen, над которой я сейчас работаю, может рекурсивно генерировать код Фреге для всего пакета Java и его подпакетов. Мы могли бы просто указать корневой пакет javafx, и он создал бы модули Frege для всех классов во всех его подпакетах. Я выпущу это, надеюсь, к концу этой недели.

person Marimuthu Madasamy    schedule 18.08.2015
comment
Чтобы упростить задачу для пользователей, рассматривали ли вы возможность замены точек на $, начиная справа, до тех пор, пока не будет найден класс или не останется точек? Я делаю это в компиляторе в frege.compiler.JavaTypes.classForName - person Ingo; 18.08.2015
comment
Как любопытный сторонний наблюдатель, я просто задаюсь вопросом: почему компилятор Frege не может автоматически генерировать эти типы, просто видя ссылку на них во время компиляции? Я знаю, что Frege — это совершенно другой зверь, но в Scala почти все время можно просто бесплатно использовать существующие типы и модули JVM без какой-либо ручной проводки. Я не говорю, что это должно иметь место во Фреге для всех частей JVM, но перечисления - это такая простая и чистая конструкция... - person Erik Kaplun; 19.08.2015
comment
@ErikAllik Перечисление не так просто, как вы думаете, потому что оно может иметь методы, которые могут возвращать значение некоторого типа, который может быть чистым или нечистым, неизвестным компилятору Фреге. Он отличается от Scala тем, что в Frege побочные эффекты отслеживаются компилятором, в отличие от Scala, где вы можете вводить побочные эффекты где угодно. Это означает, что все методы должны явно указывать побочные эффекты по Фреге. Для нативных типов и методов компилятор Frege не может знать и гарантировать это самостоятельно. - person Marimuthu Madasamy; 19.08.2015
comment
Я знаю Haskell, так что да. Но перечисления без методов все еще могут обрабатываться автоматически. Или все перечисления, кроме методов, всегда игнорируются. - person Erik Kaplun; 20.08.2015
comment
Кроме того, необходимо проверить, может ли метод возвращать значение null (для чего требуется Maybe) или генерировать исключение RuntimeException, и как с этим обращаться. Жесткость, которую требует Фреге при обращении к Java, позволяет языку поддерживать свои гарантии типов. - person Dierk; 21.08.2015