在 Frege 中导入 Java 个库
Import Java library in Frege
我正在试用 frege,我正在努力尝试使用一些本机 Java 库。
我正在尝试使用 leiningen 插件和 Joda 时间。显然 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
显然,在这种情况下 class 路径被忽略了。
您可以尝试在 -cp 中提供两个罐子,但您还需要说明 class 到 运行。 frege编译器是frege.compiler.Main
关于另一个错误,我认为与 "years" 有关,由于名称简单,它被视为实例方法。
而另一种方法由于限定名称而被视为 class 方法。
定义原生函数foo的规则是:
[pure] native foo XXX :: frege 类型
- 对于实例方法,XXX 必须是一个简单的名称。您也可以将 XXX 留在外面,在这种情况下,它与您定义的 frege 名称相同(例如 foo)。
- 对于 class 方法,XXX 必须是方法的完全限定名称。
- 对于构造函数,XXX 必须是 "new"
- 对于成员访问,XXX 必须是“.member”,其中 member 是实际的成员名称。
正如 Ingo 所写,years
被认为是一个实例方法,因为它缺少完全限定名称,即:我需要反过来写。我的 helloworld 代码的最终工作示例:
module Hello where
data JodaYears = native org.joda.time.Years where
pure native years org.joda.time.Years.years :: Int -> JodaYears
pure native getYears :: JodaYears -> Int
main _ = println $ JodaYears.getYears $ JodaYears.years 5
我正在试用 frege,我正在努力尝试使用一些本机 Java 库。
我正在尝试使用 leiningen 插件和 Joda 时间。显然 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显然,在这种情况下 class 路径被忽略了。 您可以尝试在 -cp 中提供两个罐子,但您还需要说明 class 到 运行。 frege编译器是frege.compiler.Main
关于另一个错误,我认为与 "years" 有关,由于名称简单,它被视为实例方法。 而另一种方法由于限定名称而被视为 class 方法。
定义原生函数foo的规则是:
[pure] native foo XXX :: frege 类型
- 对于实例方法,XXX 必须是一个简单的名称。您也可以将 XXX 留在外面,在这种情况下,它与您定义的 frege 名称相同(例如 foo)。
- 对于 class 方法,XXX 必须是方法的完全限定名称。
- 对于构造函数,XXX 必须是 "new"
- 对于成员访问,XXX 必须是“.member”,其中 member 是实际的成员名称。
正如 Ingo 所写,years
被认为是一个实例方法,因为它缺少完全限定名称,即:我需要反过来写。我的 helloworld 代码的最终工作示例:
module Hello where
data JodaYears = native org.joda.time.Years where
pure native years org.joda.time.Years.years :: Int -> JodaYears
pure native getYears :: JodaYears -> Int
main _ = println $ JodaYears.getYears $ JodaYears.years 5