跳转至

iterable类型

为了方便对数据结构进行处理,特定义了iterable(可迭代)抽象类型:

  1. iterable是一种特定的struct类型。
  2. iterable有next()这个方法。
  3. next()方法返回struct类型 $[ finished, value ],也可以返回 $[ finished, value, value2 ] 以支持for name, value in
    • finished字段是bool类型,以标识是否已经结束。
    • valuevalue2是返回的数据。

for in支持iterable类型。建议数据结构通过iter()方法返回iterable类型,形成统一的接口,方便处理。 例如:

a:=array(1,2,3);
for x in a.iter() do 
    println("x={}", x);
打印:
x=1
x=2
x=3

范例

List(列表)数据结构

L1 := list(1,2,3); // head=struct(val:1,next:struct(val:2,next:struct(val:3,next:NIL))
L1.push("hello").push(4).push(5); // head=struct(val:1,next:struct(val:2,next:struct(val:3,next:struct(val:"hello",next:struct(val:4,next:struct(val:5,next:NIL)))))
L1.pop(); // head=struct(val:2,next:struct(val:3,next:struct(val:"hello",next:struct(val:4,next:struct(val:5,next:NIL))))
L1.push(6).push(7);
L1.erase(2);
L1.pop(); // head=struct(val:"hello",next:struct(val:4,next:struct(val:5,next:struct(val:6,next:struct(val:7,next:NIL))))
it := L1.iter();
it.next();
L1.insert(it, "world"); // head=struct(val:"hello",next:struct(val:"world",next:struct(val:4,next:struct(val:5,next:struct(val:6,next:struct(val:7,next:NIL)))))
for x in L1.iter() do
    println("x={}", x);

function list(...args)
begin
    it := $[
        head: $[],
        push: (self, x) => begin
                if struct_empty(self.head) then
                    self.head := $[ val: x, next: nil];
                else begin
                    curr := self.head;
                    while curr.next do curr := curr.next;
                    curr.next := $[ val: x, next: nil];
                end
                return self;
            end,
        pop: (self) => begin
                if struct_empty(self.head) then raise "list is empty!";
                node := self.head;
                self.head := self.head.next ? self.head.next : $[];
                return node.val;
            end,
        erase: (self, x) => begin
                curr := self.head;
                prev := self.head;
                while not struct_empty(curr) do begin
                    if curr.val = x then begin
                        if curr = self.head then begin 
                            curr := curr.next;
                            self.head := curr;
                        end
                        else
                            prev.next := curr.next;
                    end
                    prev := curr;
                    curr := curr.next ? curr.next : $[];
                end
            end,
        insert: (self, iter, x) => begin
                if self <> iter.list then raise "self not equal!";
                if struct_empty(iter.curr) then push(self, x);
                else begin
                    st := $[ val: iter.curr.val, next: iter.curr.next];
                    iter.curr.val := x;
                    iter.curr.next := st;
                end
            end,
        iter: (self) => $[
            list: self,
            curr: self.head,
            next: (self) => begin
                    while not struct_empty(self.curr) do
                    begin
                        val := self.curr.val;
                        self.curr := self.curr.next ? self.curr.next : $[];
                        return $[ finished: false, value: val];
                    end
                    return $[ finished: true];
                end,
        ],
    ];
    for x in args.iter() do it.push(x);
    return it;
end;

std.iter

在Unit 2.0中将实现std.iter,用于提供通用的iterable类型及其相关算法的实现。

例如:

take(n): 取前N个元素。

skip(n): 跳过N个元素。

filter(pred): 按条件过滤元素。

chain(iterable): 串联iterable类型。

zip(iterable, iterable): 把两个iterable类型仿真成一个。

...