Heptagon 迭代器

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 迭代器操作。迭代次数为 3addFun 为迭代计算算子。其中 i1, i2 为 fold 操作的输入数组参数。累计器的初始值为 0。在该例程中,迭代算子的计算效果为将数组元素累加至累计器。

foldi 迭代器

foldi 迭代器的语义同 fold 相同,不同点在于对迭代器算子,输入参数的末尾需包含指示迭代索引的整型参数。foldifold 的拓展,与mapimap 的拓展相同。

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 迭代器

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

相关推荐
经纬恒润1 年前
SCADE—产品级安全关键系统的MBD开发套件
scade
碧蓝幻想1 年前
Unbuntu20.4编译安装lustre客户端
linux·运维·lustre