Heptagon 对数组数据类型,支持迭代器高阶运算如 map, fold, mapfold, mapi, foldi。这些运算,在 Scade 语言中有同名运算符,在语义上也一致。
map 迭代器
map 是一种 arrays to arrays 运算。其形式如 map<<size>> fun (arrs)。其中 size 为迭代次数; arrs 为输入数组列表; fun 为每次迭代计算的算子。fun 每周期计算输入数组的一组元素,得出的结果作为输出数组的元素。map 使用样例如
fun addFun(i1,i2: int) returns (o: int)
let
o = i1 + i2;
tel
fun mapFun(i1,i2: int ^3) returns (o: int ^3)
let
o = map<<3>> addFun(i1, i2);
tel
在上例中,o = map<<3>> addFun(i1, i2); 为map 迭代器表达式。迭代次数为3,输入数组 i1, i2 为长度为3的一维数组。在每次迭代中,应用 addFun 算子对数组元素进行计算,在本例中,计算操作为 + 操作。输出数组为输入数组元素的和。
mapi 迭代器
mapi 迭代器的语义与 map 相同。形式如 mapi<<size>> fun (arrs)。不同点在于对 fun 的输入参数列表中,最末需包含整型参数,指示当前迭代的数组索引。mapi 使用样例如
fun andFun(i1,i2: bool; idx: int)
returns (o: bool)
let
o = i1 and i2;
tel
fun mapiFun(i1,i2: bool ^3)
returns (o: bool ^3)
let
o = mapi<<3>> andFun(i1, i2);
tel
上例与 map 的使用样例类似。需要注意的是算子andFun 的输入参数列表。在参数列表末尾,存在 idx: int 参数,指示当前迭代的索引值。
fold 迭代器
fold 迭代器的语义与 Scade 中 fold 语义一致,是arrays to scalar 的一种高阶运算。在Heptagon 中其形式如 fold<<size>> fun (arrs, acc)。其中,size 为迭代次数;fun 为迭代算子; arrs 为输入列表; acc 为累计计算的初始值。fold 计算的结果为迭代计算后,累计的计算值。
fold 的使用样例如
fun addFun(i1,i2,acc: int) returns (o: int)
let
o = acc + i1 + i2;
tel
fun foldFun(i1,i2: int ^3) returns (o: int)
let
o = fold<<3>> addFun(i1, i2, 0);
tel
在该例子中,fold<<3>> addFun(i1, i2, 0); 为 fold 迭代器操作。迭代次数为 3。addFun 为迭代计算算子。其中 i1, i2 为 fold 操作的输入数组参数。累计器的初始值为 0。在该例程中,迭代算子的计算效果为将数组元素累加至累计器。
foldi 迭代器
foldi 迭代器的语义同 fold 相同,不同点在于对迭代器算子,输入参数的末尾需包含指示迭代索引的整型参数。foldi 对 fold 的拓展,与mapi 对 map 的拓展相同。
foldi 使用样例如
fun addFun(i1,i2,acc, idx: int) returns (o: int)
let
o = acc + i1 + i2;
tel
fun foldiFun(i1,i2: int ^3) returns (o: int)
let
o = foldi<<3>> addFun(i1, i2, 0);
tel
在该例子中,逻辑与 fold 迭代器例子一致。需注意的是在算子 addFun 的输入参数列表中,idx: int 参数指示当前迭代的索引。
mapfold 迭代器
mapfold 为map迭代器与fold 迭代器的集合。Heptagon 中 mapfold 的语义与 Scade 中 mapfold 语义一致。形式如 mapfold <<size>> fun (arrs, acc)。mapfold 的效果为输出 map 迭代计算后的输出数组,与 fold 迭代计算效果的累计计算结果。
mapfold 使用样例如
fun addFun(i1,i2,acc: int)
returns (o, o_acc: int)
let
o_acc = i1 + i2 + acc;
o = i1 + i2;
tel
fun mapfoldFun(i1,i2: int^3)
returns (o: int^3; acc: int)
let
(o, acc) = mapfold<<3>> addFun(i1, i2, 0);
tel
在该例程中,迭代算子 addFun 的输出为输出数组的元素与累计器值。