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
的输出为输出数组的元素与累计器值。