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

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

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

相关文章:

  • 团体程序设计天梯赛-练习集——L1-013 计算阶乘和
  • 嵌入式知识点总结 C/C++ 专题提升(一)-关键字
  • windows蓝牙驱动开发-蓝牙设备栈
  • Git:问题解决办法 及 Tips 总结
  • Mockito+PowerMock+Junit单元测试
  • 考研计算机组成原理——零基础学习的笔记
  • PHP基础(上)
  • VUE学习笔记(入门)5__vue指令v-html
  • 供应链系统设计-供应链中台系统设计(八)- 商品中心设计篇
  • 网络安全VS数据安全
  • Springboot 注解缓存使用教程
  • 【华为路由/交换机的ssh远程设置】
  • SDL2基本的绘制流程与步骤
  • Rocky Linux 安装redmine记录
  • IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时无法使用JDK8?
  • 【Rust自学】13.6. 迭代器 Pt.2:消耗和产生迭代器的方法
  • React实现拖拽特效
  • QT入门的一些吐槽
  • 二叉树02(数据结构初阶)
  • Go语言的文件操作
  • 【K8S系列】K8s 领域深度剖析:年度技术、工具与实战总结
  • 十一、apply家族(4)
  • 【QT用户登录与界面跳转】
  • Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记
  • “UniApp的音频播放——点击视频进入空白+解决视频播放器切换视频时一直加载的问题”——video.js、video-js.css
  • 短链接功能实现