【问题标题】:Import Java library in Frege在 Frege 中导入 Java 库
【发布时间】:2015-04-16 01:59:24
【问题描述】:

我正在尝试 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

根据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,但编译仍然失败

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

【问题讨论】:

  • 关于 leininingen 问题我不确定,但您的项目文件中可能有问题?我曾经为自己使用这个插件,将依赖项添加到 jline,并获得了正确的编译器调用。如果您觉得有错误,如果您有 github 帐户,请考虑在 frege-leiningen 子项目github.com/Frege/frege-lein-plugin 上打开一个问题。
  • 我很困惑 lein 插件如何找到 jline 依赖项但在这里不起作用...我将在 github 上打开一个问题

标签: java frege


【解决方案1】:

简短的回答,因为使用手机。

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

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

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

定义原生函数foo的规则如下:

[pure] native foo XXX :: frege 类型

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

【讨论】:

  • 是的,您今天早上的简短编辑实际上足以编译代码,我将在这里添加我的 hello world 的最终结果,以及可能遇到同样问题的人。我之前没有回复过,因为编译后我一直在努力让它在之后运行(leiningen 插件不处理类路径)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多