如何在ATS中创建队列?

时间:2016-10-25 15:01:22

标签: ats

我可以像堆栈一样使用列表,但是在ATS中创建队列的正确方法是什么?例如,假设我有以下伪代码:

val xs = queue_create()
val () = xs.enqueue(1)
val () = xs.enqueue(2)
val () = print(xs.dequeue()) // print 1
val () = xs.enqueue(3)
val () = print(xs.dequeue()) // print 2
val () = print(xs.dequeue()) // print 3

我应该看到打印出1,2和3。

2 个答案:

答案 0 :(得分:2)

由于我不知道ATS标准库中内置的队列类型,因此我从我的一个项目中提供了自己的基本实现,该项目是根据Linear Channels for Asynchronous IPC章节中引用的代码改编的。 > ATS编程简介一书。

请参阅this snippet中的工作示例。

答案 1 :(得分:0)

你可以采用冗长的方式:使用指向单链表的头尾的两个指针。

但是,确保此实施确实有效并非如此微不足道。它依赖于数据视图来编码某些不变量,因此非常复杂,但是外向的API根本不难使用。我还使用了“侵入式”链表,使用例更简单。

核心定义如下:

对单链接列表段进行编码的视图:段只是单个链接,“最后”next指针可指向任何位置,包括NULL

dataview slseg_v
  (addr(*self*), addr(*last node's [next]*), int(*segment length*)) =
  | {n:nat} {l1,l2,l3:addr}
    slseg_v_cons (l1, l3, n+1) of (
      mfree_gc_v (l1), slseg_node_v (l2, l1), slseg_v (l2, l3, n)
    ) // end of [slseg_v_cons]
  | {l:addr} slseg_v_nil (l, l, 0)
// end of [slseg_v]

键入基于列表的队列:它是空的,或者包含一个大小,一个指向段头的指针,以及一个指向段尾的指针:

datavtype queuelst_vt (int) =
  | {n:nat} {l1,l2,l3:addr}
    queuelst_vt_some (n+1) of (
      slseg_v (l1, l2, n),
      mfree_gc_v (l2),
      slseg_node_v (null, l2)
    | int n, ptr l1, ptr l2
    ) // end of [queuelst_vt_some]
  | queuelst_vt_none (0) of ()

您可以在Glot.io

运行完整代码

这是同一个code的清理版本 - 这一次,我试图确保代码具有干净的接口/实现分离。