【问题标题】:How do I declare Java enums in Frege native declarations?如何在 Frege 本机声明中声明 Java 枚举?
【发布时间】:2015-08-18 22:48:18
【问题描述】:

在 JavaFX Animation 类上使用 Frege native-gen 工具时,它会生成 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

在本机声明中处理此问题的建议方法是什么?

【问题讨论】:

  • Animation.Status 上运行它会做什么?
  • 嗯,枚举是包含的,所以我不能在上面运行生成器。
  • 一定还是可以的,不管是嵌套的。

标签: java enums frege


【解决方案1】:

我们可以为内部类生成弗雷格代码。输入到 native-gen 工具的类名是 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 模块。我希望在本周末之前发布它。

【讨论】:

  • 为了让用户更轻松 - 您是否考虑过用 $ 从右开始替换点,直到找到类或没有点为止?我在 frege.compiler.JavaTypes.classForName 的编译器中执行此操作
  • 作为一个好奇的旁观者,我只是想知道:为什么弗雷格编译器不能仅通过在编译时查看对它们的引用来自动生成这些类型?我知道 Frege 与它完全不同,但在 Scala 中,几乎所有时间都可以免费使用现有的 JVM 类型和模块,而无需任何手动连接。我并不是说在 Frege 中对于 JVM 的所有部分都应该是这种情况,但枚举是如此简单和纯粹的构造......
  • @ErikAllik 枚举并不像您想象的那么简单,因为它可以具有可以返回某种类型的值的方法,这些值可能是 Frege 编译器不知道的纯或不纯类型。它与 Scala 的不同之处在于,在 Frege 中,副作用由编译器跟踪,而 Scala 则可以在任何地方引入副作用。这意味着所有方法都应该明确说明 Frege 中的副作用。对于原生类型和方法,Frege 编译器不能自己知道和保证这一点。
  • 我很了解 Haskell。但是无方法的枚举仍然可以自动处理。或者所有枚举但方法总是被忽略。
  • 此外,必须检查一个方法是否可能返回 null(这需要 Maybe)或抛出 RuntimeException 以及如何处理这些。 Frege 在调用 Java 时要求的刚性允许该语言保持其类型保证。
猜你喜欢
  • 2011-10-23
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多