在 Scade 表达式支持的算子中,有一类算子被称为高阶(Higher-Order)算子。其中高阶的含义为此类算子的输入参数的类型,为用户定义的算子或原生的算子。迭代器算子是高阶算子的一种,在 Scade 中,迭代器类型算子包括: map
, fold
, mapfold
。
map 算子
map
算子以数个数组序列、操作数组元素的算子作为输入参数。其执行效果为对输入数组的元素进行处理,生成输出数组中对应位置的值。
map
算子的语法定义如下
(map operator << expr >>) (list)
其中,operator
为作为输入参数的算子,该算子对输入数组的各元素进行处理。expr
指示迭代次数。list
为输入数组列表。
例子
在以下例程中,map
迭代器输入有两项输入数组,mult_scalar
对数组中各元素作处理,输出一项数组。
function mult_scalar(a,b: int32) returns (c: int32)
c = a * b;
function mapOp(x: int32; t: int32^3) returns (u: int32^3)
let
u = (map mult_scalar <<3>>)(x^3, t);
tel
fold 算子
fold
算子对数组中的各元素进行累计处理,计算得出值。
fold
算子的语法定义形式如
(fold operator << expr >>) (list)
其中,operator
为对数组各元素进行累计计算处理的算子。expr
指代迭代次数。list
为输入参数,其中首项参数,为指代累计初始值。
例子
在下面的例程中,fold
处理长度为 9 的数组参数。值 arr1[0]
为累计计算的初始值,处理的数组为 arr1[1 .. 9]
。每次迭代计算,addOp
中的a, b
参数分别为累计值、arr1[1 .. 9]
中的元素值。
function foldOp(arr1: int8^10) returns (ival: int8)
ival = (fold addOp <<9>>) (arr1[0], arr1[1 .. 9]);
function addOp(a, b: int8) returns (c: int8)
c = a + b;
mapfold 算子
mapfold
算子在效果上类似 map
算子与 fold
算子的集合。其既可包含 fold
算子的效果,也可包含 map
算子的效果。
mapfold
的语法定义如下
(mapfold [[INTEGER]] operator <<expr>>) (list)
其中,INTEGER
指示在输入参数 list
中,靠前 INTEGER
数量的参数为累计变量;operator
为处理数组输入参数的算子;expr
指示迭代操作次数。list
为输入参数列表。在数据参数列表中,前 INTEGER
项为用于 fold
计算效果的累计初始值。
例子
在以下例子中,在(mapfold 2 subOp <<10>>) (0, 0, i1, i2)
中,2 指示在输入参数列表中,前两项 0, 0
指代累计器变量。算子 subOp 包含对输入数组参数i1, i2
的 fold 处理与 map 处理。在本例中,处理后返回2项累积计算结果 oaac1, oaac2 与 输出数组 oarr1, oarr2。
function mapfoldOp(i1,i2: int8 ^10)
returns (oacc1, oacc2: int8; oarr1, oarr2: int8 ^10)
oacc1, oacc2, oarr1, oarr2 = (mapfold 2 subOp <<10>>)(0, 0, i1, i2);
function
#pragma kcg expand #end
subOp(i_acc1, i_acc2, i1, i2: int8) returns (o_acc1, o_acc2, o1, o2: int8)
let
o_acc1 = i_acc1 + i1 + i2;
o_acc2 = i_acc2 + i1 - i2;
o1 = i1 + i2;
o2 = i1 - i2;
tel