Bootstrap

Scade 表达式 - 迭代器

在 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
;