我正在尝试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
,但是编译仍然失败感谢任何可能对此有所了解的人
最佳答案
简短的回答,因为使用手机。
您不能同时使用-cp和-jar调用Java
显然,在这种情况下将忽略类路径。
您可以尝试在-cp中提供两个jar,但是您还需要说出要运行的类。 frege编译器为frege.compiler.Main
关于其他错误,我认为与“年”有关,由于名称简单,因此将其作为实例方法。
而由于限定名称,其他方法被视为类方法。
因此,定义本机函数foo的规则是:
[pure] native foo XXX :: frege类型
对于实例方法,XXX必须是一个简单名称。您也可以将XXX排除在外,在这种情况下,它与您要定义的法语名称相同(例如foo)。
对于类方法,XXX必须是方法的标准名称。
对于构造函数,XXX必须是“ new”
对于成员访问,XXX必须是“ .member”,其中member是实际的成员名称。