iterable类型
为了方便对数据结构进行处理,特定义了iterable(可迭代)抽象类型:
- iterable是一种特定的
struct
类型。 - iterable有
next()
这个方法。 next()
方法返回struct
类型$[ finished, value ]
,也可以返回$[ finished, value, value2 ]
以支持for name, value in
。finished
字段是bool
类型,以标识是否已经结束。value
和value2
是返回的数据。
for in
支持iterable类型。建议数据结构通过iter()
方法返回iterable类型,形成统一的接口,方便处理。
例如:
范例
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类型仿真成一个。
...