mar*_*iop 5 java interop frege
我想了解Frege List的工作原理以及如何从Java中使用它.当我下载Frege编译器代码时,我发现很难理解Frege代码中的Frege List是什么.
做一些测试我发现Frege List是TListJava中类的一个实例,它带有一个特殊的方法,叫做_Cons()返回一个DCons对象.DCons正如所料,是一对,其中该对的第一个元素对应于列表的头部,而第二个元素是尾部,因此是另一个TList.在_Cons()空列表上调用时,返回值为null.因此,要在Frege上实现Java迭代器TList,可以编写:
public class TListIterator implements Iterator<Object> {
DCons elem;
public TListIterator(TList list) {
this.elem = list._Cons();
}
@Override
public boolean hasNext() {
return this.elem != null;
}
@Override
public Object next() {
final Object head = Delayed.<Object>forced( this.elem.mem1 );
this.elem = this.elem.mem2.<TList>forced()._Cons();
return head;
}
@Override
public void remove() {
throw new RuntimeException( "Remove is not implemented" );
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
TList正确的吗?TListIterator吗?TList,DList并且DCons在Frege编译器源代码中?他们有记录吗?TListIterator通过从Frege 转换TList为Java ,可以始终避免使用LinkedList.首先,从Java调用Frege的最终指南就是这个wiki页面.
除其他外,它解释了如何在Java代码中显示frege数据声明.
关于列表的唯一特殊之处在于,在任何地方都没有明确的Frege声明,但我们可以假设它看起来像:
data List a = List | Cons a (List a)
Run Code Online (Sandbox Code Playgroud)
请注意,List等号后面的标识符是空列表的构造函数,通常称为Nil.调用它的原因List(与类型相同)是因为将frege名称修改为有效java名称的例程转换[]为List.在Frege源代码中,我们也使用[]类型名称和构造函数名称.
以下是与上述内容对应的Java代码的概要:
public interface TList extends frege.runtime.Value, frege.runtime.Lazy {
public TList.DCons _Cons() ;
public TList.DList _List() ;
final public static class DCons extends frege.runtime.Algebraic implements TList {
private DCons(final java.lang.Object arg$1, final frege.runtime.Lazy arg$2) {
mem1 = arg$1; mem2 = arg$2;
}
final public static TList mk(final java.lang.Object arg$1, final frege.runtime.Lazy arg$2) {
return new DCons(arg$1, arg$2);
}
final public DCons _Cons() { return this; }
final public TList.DList _List() { return null; }
final public java.lang.Object mem1 ;
final public frege.runtime.Lazy mem2 ;
}
final public static class DList extends frege.runtime.Algebraic implements TList {
private DList() {}
final public static TList mk() { return it; }
final public static DList it = new DList();
final public DList _List() { return this;}
final public TList.DCons _Cons() { return null; }
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,整体类型是一个界面TList.您可以对列表执行的唯一操作是检查变量,为此我们有方法_List()和_Cons().正如您所正确观察的那样,_Cons()返回null空列表,并返回TLIst.DCons非空列表的实例.从那里你可以提取头部(mem1)和尾部(mem2).
据我所知,你的列表迭代器应该可以正常工作.
观察简单编码以避免Java中的重复名称:
Foo获得名称TFoo.Bar获取名称DBarDBar方法_Bar.(注意,没有显式字段对构造函数进行编码,这样我们就可以将JVM对象头用于我们的目的,无论如何都要编码)当然,命名一见钟情有点神秘.但它并不完全适合普通用户.事实上,我并不认为从Java中调用Frege对任何人来说都是有趣的.但是现在我的想法不同了,我们正在设计一种方法来实现在Frege中实现Java接口(看起来这也可以满足您的目的).
对于你的上一个问题,我认为这取决于你.如果你只能返回int或double或string,那肯定是最好的.如果这不起作用并且您需要一个列表,那么使用自定义迭代器的方法是可取的,恕我直言.另一种方法是创建一个Java List,但这不是纯粹的,因为List必须在Frege中声明为mutable.此外,通过有效地复制列表,您将浪费空间.
另一种可能性是返回一个数组.例如,您可以在REPL中看到以下内容
foo a b c = arrayFromList [a,b,c] :: JArray Int
Run Code Online (Sandbox Code Playgroud)
会得到如下签名:
final public static int[] foo(...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |