1

我正在尝试 frege,并且我正在努力尝试使用一些本机 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

这不应该发生,因为根据维基,这不应该发生,因为

正在运行的 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,但编译仍然失败

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

4

2 回答 2

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”,其中member是实际的成员名称。
于 2015-04-15T07:07:57.473 回答
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
于 2015-04-15T17:59:24.240 回答