当前位置: 首页 > article >正文

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold,会对输入数组参数中的元素逐个作处理,不需要数组元素的索引信息。若在处理数组元素时,需要数组元素相应的索引信息,则可使用迭代器算子 mapi, foldi, mapfoldi

mapi 算子

mapi 算子的行为与 map 相似,都会对输入数组的所有元素进行处理,并输出新的数组。mapi 的语法定义为

(mapi operator <<expr>>) (list)

mapi 与 map 的不同点在于,对 operator 算子,输入参数列表的首项参数需为整数类型。在 mapi 执行时,输入的值为当前周期处理的元素对应的索引值。

例子

在下面的例子中 mapi 表达式 (mapi subOp <<10>>)(i1, i2) 内处理数组元素的算子为 subOp。可以注意到,subOp 的函数签名中,首项输入参数 index 的含义为当前周期处理的元素对应的索引值。

function mapiOp(i1,i2: int8 ^10) returns (o: int8 ^10)
  o = (mapi subOp <<10>>)(i1, i2);

function #pragma kcg expand #end subOp(index: int8; i1,i2: int8) returns (o: int8)
let
  o = if (index mod 2 = 0)
      then
        (i1 + i2)
      else
        (i1 - i2)
      ;
tel

foldi 算子

foldi 算子的作用与 fold 相似。不同点在于对输入数组的元素进行处理时,会提供元素相应的索引信息。

foldi 的语法定义如下

(foldi operator <<expr>>) (list)

其中 operator 算子的输入参数列表中的第一项参数需为整型。在运行期间的语义中,该项参数指示当前周期处理的数组元素的索引。

例子

在以下例程中,foldi 表达式 (foldi subOp <<3>>)(0, i1, i2) 中,subOp 的输入参数列表中,首项参数index 为当前周期处理元素的索引。

function foldiOp(i1,i2: int8 ^3) returns (o: int8)
   o = (foldi subOp <<3>>)(0, i1, i2);

function #pragma kcg expand #end
subOp(index: int8; acc: int8; elem1,elem2: int8)
returns (o: int8)
  o = if (index mod 2 = 0) then (acc + elem1 + elem2) else (acc);

mapfoldi 算子

mapfoldi 算子的效果同 mapfold 类似,可同时提供 map 的效果与 fold 的效果。mapfoldi 与 mapfold 的不同点在于,在处理数组元素时,mapfoldi 将提供输入数组元素对应的索引信息。

mapfoldi 的语法定义如下

(mapfoldi [[INTEGER]] operator <<expr>>)(list) 

例子

在以下例程中,对 mapfoldi 表达式 (mapfoldi 2 subOp <<10>>)(0, 0, i1, i2),算子subOp 的输入参数的首项参数 idx 为当前周期处理元素在输入数组中的索引。

function mapfoldiOp(i1,i2: float32 ^10)
returns (o_acc1, o_acc2: float32; o_arr1, o_arr2: float32 ^10)
  o_acc1, o_acc2, o_arr1, o_arr2 = (mapfoldi 2 subOp <<10>>)(0, 0, i1, i2);

function
#pragma kcg expand #end
subOp(idx: int8; acc1,acc2: float32; i1,i2: float32)
returns (o_acc1, o_acc2, o1, o2: float32)
let
  o_acc1 = if (idx mod 2 = 0) then (acc1 + i1 + i2) else acc1;
  o_acc2 = if (idx mod 2 <> 0) then (acc2 + i1 - i2) else acc2;
  o1 = if (idx mod 2 = 0) then i1 else i2;
  o2 = if (idx mod 2 = 0) then i2 else i1;
tel

http://www.kler.cn/a/512109.html

相关文章:

  • 第七篇:vue3 计算属性:computed
  • 【Leetcode 热题 100】45. 跳跃游戏 II
  • postman请求参数化
  • Centos 8 交换空间管理
  • 大数据学习(36)- Hive和YARN
  • Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations
  • 【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
  • 2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)
  • 电子科大2024秋《大数据分析与智能计算》真题回忆
  • mysql的mvcc
  • 详解共享WiFi小程序怎么弄!
  • RFID系统安全认证协议及防碰撞算法研究(RFID Security)
  • Linux 存储设备和 Ventoy 启动盘制作指南
  • Linux C\C++方式下的文件I/O编程
  • Oracle 创建并使用外部表
  • JavaWeb项目——如何处理管理员登录和退出——笔记
  • Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用
  • AUTOSAR从入门到精通-自动驾驶测试技术(二)
  • CSS 合法颜色值
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)
  • 25春秋杯wp
  • Unity Shader学习日记 part5 CG基础
  • 02_登录窗口
  • leetcode 62. 不同路径
  • CentOS 7中 分区工具fdisk的常用命令【解释来自gpt】
  • PHP For 循环