chisel之scala 语法

在这里插入图片描述

Chisel新手教程之Scala语言(1)

Value & variable

Value是immutable的,当它被分配一个数据后,无法进行重新分配。用 val 表示。

Variable是mutable的,可以重复赋值。用 var 表示。示例如下:

val a = 2  // value
var i = 2  // variable

Type

所有的Scala数据都有一个类型(type),所有的Scala类型都定义为类(class)。

对于语句 val a = 2 来说,a 会被推断为整数类型 Int 。可以通过显式定义的方式来指明 a 的类型,写法是

val a: Int = 2

Tuple

Tuple用来表示一组数据的集合。例如下面的(key, value)组合,其中 _1 表示该tuple的第一个数据, _2 表示该tuple的第二个数据,以此类推。

val myTuple = ("Age", 39)
val myKey = myTuple._1  // "Age"
val myValue = myTuple._2  // 39

Tuple还可以用操作符 -> 来表示,例如上例中 myTuple 可以写成

val myTuple = "Age" -> 39

If…Else

If…Else expression block的返回值为 if 或者 else 条件满足时对应的 expression block 的返回值。例如下面代码中 x 的值为 a 和 b 的较大值。

val x = if (a > b) a else b
下式的返回值为对应条件满足的子expression block的返回值。

if (condition0) {expression_block_0
} else if (condition1) {expression_block_1
} else {expression_block_2
}

Match expression

Match expression会对每个match项进行匹配,执行第一个匹配项对应的expression block。对于 default 项,可以用 _ 来表示。如下例:

val rank = score match {case 5 => "Excellent"case 4 => "Great"case _ => "Good"
}

Loops

最基本的 loop 是 for 循环,下面的代码中第一行会打印 0 到 5,第二行会打印 0 到 4。

for (i <- 0 to 5) { println(s"$i") }
for (i <- 0 until 5) { println(s"$i") }

如果想让 for 表达式返回一个集合,可以用 yield 关键词

for (i <- 0 until 5) yield { s"Index $i" }
添加 if 表达式可以实现过滤功能,如下例中只对偶数的 i 进行操作。

for (i <- 0 until 64 if i % 2 == 0) { expression_block }


Chisel新手教程之Scala语言(2)

Function基本介绍

Function可以被看作一个带parameter(参数)输入的expression block(记得上一节介绍的expression block吧)。

例如,你可以定义一个名为double的函数,把输入的整形参数乘以2作为返回值。如下:

Example 1.1

def double(x: Int): Int = 2 * x
上式中 x: Int表示输入parameter是一个Int类型,之后的第二个 : Int指出函数返回值也是Int类型。等号右边是一个expression,其返回值是输入参数乘以2。

上面的代码可以简化成不包含返回类型,因为可以自动推导出返回类型是Int。如下:

def double(x: Int) = 2 * x
函数的等号右边可以是一个包含多行的expression block。例如下面代码,其返回值是 2 * y

def f(x: Int): Int = {val y = x + 52 * y
}

函数可以不包含参数,或者包含多个参数,如下:

Example 1.2

def myNum = 4
def adder(x: Int, y: Int): Int = { x + y }

Higher-order function

Higher-order function指的是一个function可以做为另一个function的输入参数(parameter),或者返回值。Higher-order function是functional programming的一个重要概念,也是初学Chisel需要重点掌握的概念。

直观的想,可以和C语言对比。C函数的输入参数只能是变量,不能是函数名。但Scala则可以输入函数作为参数。

举一个简单的例子,假设我们为一个数组设计一个名为reduce的方法(method),该方法可以将该数组中的所有成员通过某种运算返回一个数作为结果。例如把所有成员加起来,或者乘起来。如下面的代码,MyArray是一个数组类,只包含两个数组成员a和b(通过参数实例化),并定义了reduce方法,该方法接受f函数(方法)作为参数。f的type是(Int, Int) => Int。

class MyArray(val a: Int, val b: Int) {def reduce(f: (Int, Int) => Int) = { f(a, b) }
}

接下来,在下面代码中m为MyArray的一个例化,其成员a和b被赋予值2和4。并定义了两个函数add和mul分别执行加法和乘法。m在调用reduce方法时可以选择函数add或者mul作为输入参数,分别得到结果6和8。

Example 1.3

val m = new MyArray(2, 4)
def add(x: Int, y: Int): Int = { x + y }
def mul(x: Int, y: Int): Int = { x * y }
val addResult = m.reduce(add)  // 6
val mulResult = m.reduce(mul)  // 8

Placeholder syntax

Placeholder syntax可以让function literal看起来更加简洁,它通过将对应参数名替换为下划线_来实现。例如上面的Example 1.4代码的第二行可以改写为如下代码:

val sum = ary.reduce(_ + _)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454838.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果&#xff08;升级版&#xff09; 7.P1618 三连击&…

如何训练自己的模型

无论数据类型或目标如何&#xff0c;用于训练和使用 AutoML 模型的工作流都是相同的&#xff1a; 准备训练数据。 我们需要将需要训练的数据准备为jsonl格式&#xff0c;这种格式的特点就是每一行都是json的格式 {"prompt": "<prompt text>", "…

UE5动画源码剖析

重点剖析的类&#xff1a; UAnimationInstanceFAnimInstanceProxy 参考&#xff1a;https://zhuanlan.zhihu.com/p/405437842 参考&#xff1a;https://blog.csdn.net/qq_23030843/article/details/109103433 参考&#xff1a;https://ikrima.dev/ue4guide/gameplay-programm…

全网第一篇把Nacos配置中心客户端讲明白的

入口 我们依旧拿ConfigExample作为入口 public class ConfigExample {public static void main(String[] args) throws NacosException, InterruptedException {String serverAddr "localhost";String dataId "test";String group "DEFAULT_GROU…

react 之 useInperativeHandle

useInperativeHandle是通过ref暴露子组件中的方法 1.场景说明-直接调用子组件内部的方法 import { forwardRef, useImperativeHandle, useRef } from "react"// 子组件const Son forwardRef((props, ref) > {// 实现聚焦逻辑const inputRef useRef(null)const …

超多制作模板的姓氏头像生成器微信小程序源码

超多制作模板的姓氏头像生成器微信小程序源码&#xff0c;这是一款姓氏头像制作小工具&#xff0c;内含丰富多样的模板提供制作。 以前的基本是固定位置生成&#xff0c;这款制作支持拖拽调整位置&#xff0c;自定义颜色&#xff0c;阴影等等。

[VulnHub靶机渗透] MHZ_CXF: C1F

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

“SharpDocx” C#项目中用于创建 Word 文档的轻量级模板引擎

简介&#xff1a; SharpDocx是一个轻量级的模板引擎&#xff0c;用于创建Word文档。它允许开发者基于视图生成Word文档&#xff0c;这个视图本身就是一个Word文档&#xff0c;可以根据需要设置简单或复杂的布局。 以下是一些主要特点&#xff1a; 模板引擎类似Razor&#xf…

简单实践 spring clound 使用openfeign

1.概要 这是在前面工程基础上的一个变更。 前工程&#xff1a;检查实验 spring cloud nacos nacos-server-2.3.0-CSDN博客 2 代码 2.1 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-open…

润唇膏市场分析:预计2029年将达到13亿美元

近年来&#xff0c;随着中国居民人均可支配收入持续增长&#xff0c;“颜值经济”的崛起&#xff0c;中国居民对化妆品的消费将持续上升。唇部是人体肌肤中最薄最娇嫩的部分之一&#xff0c;如果护理不当&#xff0c;极其容易产生唇纹、唇部黑色素沉着、干燥起皮等问题。因此对…

SpringSecurity(17)——OAuth2令牌管理策略

刷新令牌策略 注意&#xff1a;刷新令牌只有在授权码模式和密码模式中才有&#xff0c;对应的指定这两种模式时&#xff0c;在类型上加上refresh_token <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-se…

【优先级队列(大顶堆 小顶堆)】【遍历哈希表键值对】Leetcode 347 前K个高频元素

【优先级队列&#xff08;大顶堆 小顶堆&#xff09;】【排序】Leetcode 347 前K个高频元素 1.不同排序法归纳2.大顶堆和小顶堆3.PriorityQueue操作4.PriorityQueue的升序&#xff08;默认&#xff09;与降序5.问题解决&#xff1a;找前K个最大的元素 &#xff1a;踢走最小的&…