java - 在 Frege 中导入 Java 库

标签 java frege

我正在尝试 frege,并且正在努力尝试使用一些 native Java 库。

我正在使用 leiningen 插件和 Joda time 进行尝试。显然 lein 插件无法正确设置 fregec 的类路径,或者可能与此差异有关:

java -jar ~/Downloads/frege3.22.524-gcc99d7e.jar -fp ~/.m2/repository/joda-time/joda-time/2.7/joda-time-2.7.jar src/Hello.fr

正如预期的那样,将能够找到 Joda

java -cp ~/.m2/repository/joda-time/joda-time/2.7/joda-time-2.7.jar -jar ~/Downloads/frege3.22.524-gcc99d7e.jar src/Hello.fr 

将会失败

`org.joda.time.Years` is not a known java class

根据 the wiki 的说法,这种情况不应该发生

The current class path of the running JVM plus the target directory are always on the class path.

尽管如此,即使在手动设置-fp之后,此代码仍无法编译:

module Hello where

data JodaYears = native org.joda.time.Years where
   pure native years :: Int -> JodaYears
   pure native getYears org.joda.time.Years.getYears :: JodaYears -> Int
   --                   ^ I tried both with and without this

错误是

Instance method or getter must be applied to java reference type.

但是我使用的唯一实例方法(getYears)将引用类型作为输入(JodaYears)...我什至尝试过org.joda.time.Years ,但是编译还是失败

感谢任何可能对此有所了解的人

最佳答案

简短回答,因为使用移动设备。

不能同时使用 -cp 和 -jar 调用 Java

显然,在这种情况下类路径被忽略。 您可以尝试在 -cp 中提供两个 jar,但您还需要说明要运行哪个类。 frege编译器是frege.compiler.Main

关于另一个错误,我认为与“years”有关,由于名称简单,该错误被视为实例方法。 而另一个方法由于限定名称而被视为类方法。

定义 native 函数 foo 的规则如下:

[pure] native foo XXX::frege 类型

  1. 对于实例方法,XXX 必须是一个简单的名称。您还可以省略 XXX,在这种情况下,它与您定义的 frege 名称相同(例如 foo)。
  2. 对于类方法,XXX 必须是方法的完全限定名称。
  3. 对于构造函数,XXX 必须是“new”
  4. 对于成员(member)访问,XXX 必须是“.member”,其中 member 是实际的成员(member)名称。

关于java - 在 Frege 中导入 Java 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635814/

相关文章:

frege - 递归和 StackOverflowError

java - 在java中使用split函数,分隔符为 '|'字符(OR符号)

java - MVC,减少Gui和核心包之间的耦合

java - Rest 服务的 Application 类生命周期是什么?

Java Slick : Keyboard Input

haskell - 在 Frege 中创建 State 实例

java - 根据输入值更改Java Validator的@Pattern Regex

java - 如何在 Frege 中声明带有类型变量的 native 接口(interface)?

haskell - 计数反转 : StackOverflowError in Frege, 在 Haskell 中工作正常

ant - 使用 Gradle 构建 Frege 项目的 Jar