在Frege中导入Java库

时间:2015-04-14 19:27:23

标签: java 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

,这不应该发生
  

正在运行的JVM和目标目录的当前类路径始终位于类路径上。

尽管如此,即使在手动设置-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,但编译仍然失败

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

2 个答案:

答案 0 :(得分:1)

简要回答,因为使用手机。

您不能同时使用-cp和-jar

调用Java

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

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

因此,定义本机函数 foo 的规则是:

[] 原生 foo XXX :: frege类型

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

答案 1 :(得分:1)

正如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