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

Chisel 学习笔记(一)

Chisel 学习笔记(一)

Scala基础语法

变量和常量

在scala中关键字var表示变量,val表示常量, 使用常量可以增强代码可读性,减少变量重复使用的可能
值得注意的是,Scala行末没有分号,但如果一行里有多条语句,分号则是必要的

var numberOfKittens = 6
val kittensPerHouse = 101
val alphabet = "abcdefghijklmnopqrstuvwxyz"
var done = false

numberOfKittens += 1

// kittensPerHouse = kittensPerHouse * 2 // kittersPerHouse是不可重载的,所以这一行会导致不能编译

println(alphabet)
done = true

条件语句

Scala的条件语句和其他语言类似,单行语句可以不用{}包围,但多行语句需使用大括号


// A simple conditional; by the way, this is a comment// A si 
if (numberOfKittens > kittensPerHouse) { 
    println("Too many kittens!!!") 
}
// The braces are not required when all branches are one liners. However, the 
// Scala Style Guide prefers brace omission only if an "else" clause is included.
// (Preferably not this, even though it compiles...)
if (numberOfKittens > kittensPerHouse) 
    println("Too many kittens!!!")

// ifs have else clauses, of course
// This is where you can omit braces!
if (done) 
    println("we are done")
else 
    numberOfKittens += 1

// And else ifs
// For style, keep braces because not all branches are one liners. 
if (done) {
    println("we are done")
}
else if (numberOfKittens < kittensPerHouse) {
    println("more kittens!")
    numberOfKittens += 1
}
else {
    done = true
}

Scala中的if语句是有返回值的,他的返回值是所执行if分支的最后一条语句

valval  likelyCharactersSetlikelyC  = if (alphabet.length == 26)
    "english"
else 
    "not english"

println(likelyCharactersSet)

方法和函数

函数的声明

方法的关键词是def,他的参数表是由逗号分开的,参数均为 参数名:类型 的形式 其后接上返回值的类型,如下:

// Simple scaling function with an input argument, e.g., times2(3) returns 6
// Curly braces can be omitted for short one-line functions.
def times2(x: Int): Int = 2 * x

// More complicated function
def distance(x: Int, y: Int, returnPositive: Boolean): Int = {
    val xy = x * y
    if (returnPositive) xy.abs else -xy.abs
}

没有参数的函数可以不写括号,按照惯例,没有任何副作用,仅仅返回值的函数不写括号;但是改变了外部参数,有标准输出等存在副作用的无参函数要写括号

函数的重载

同样的函数名可以通过不同的参数类型进行重载,如下:

// Overloaded function
def times2(x: Int): Int = 2 * x
def times2(x: String): Int = 2 * x.toInt

times2(5)
times2("7")

子函数和递归调用

函数内部可以声明子函数,但其子函数只在当前函数内可见

/** Prints a triangle made of "X"s/** Pri 
  * This is another style of comment
  */
def asciiTriangle(rows: Int) {
    
    // This is cute: multiplying "X" makes a string with many copies of "X"
    def printRow(columns: Int): Unit = println("X" * columns)
    
    if(rows > 0) {
        printRow(rows)
        asciiTriangle(rows - 1) // Here is the recursive call
    }
}

// printRow(1) // This would not work, since we're calling printRow outside its scope
asciiTriangle(6)

列表

列表和数组有一些区别,列表可以支持添加和提取等操作

val x = 7
val y = 14
val list1 = List(1, 2, 3)
val list2 = x :: y :: y :: Nil       // list2里面有x, y, y三个元素,Nil表示列表结束

val list3 = list1 ++ list2           //把第二个列表添加到第一个列表之后
val m = list2.length
val s = list2.size

val headOfList = list1.head          // 取得列表第一个元素
val restOfList = list1.tail          // 取得列表除去第一个元素后的所有元素

val third = list1(2)                 // 取得第三个元素,列表起始下标是0

更多List操作:https://blog.csdn.net/zengxiaosen/article/details/59490379

for循环

从0循环到7(包括7)

for (i <- 0 to 7) { print(i + " ") }
println()

从0循环到7(不包括7)

for (i <- 0 until 7) { print(i + " ") }
println()

从0循环到10(包括10)步长2

for(i <- 0 to 10 by 2) { print(i + " ") }
println()

迭代器

val randomList = List(util.Random.nextInt(), util.Random.nextInt(), util.Random.nextInt(), util.Random.nextInt())
var listSum = 0
for (value <- randomList) {
  listSum += value
}
println("sum is " + listSum)

Scala中的类和Java中的类相似,都需要先创造出实例再使用,一个类的例子如下

class WrapCounter(counterBits: Int) {	//类的构造器需要一个传入的参数

  val max: Long = (1 << counterBits) - 1
  var counter = 0L							//类中一些变量的声明
    
  def inc(): Long = {				//类中的方法
    counter = counter + 1
    if (counter > max) {
        counter = 0
    }
    counter								//方法的返回值要写在最后一行
  }
  println(s"counter created with max value $max")	//这句println在类中,视为类初始化的一部分,每次实例化该类时会打印,可在debug时使用
}

类的实例化

val x = new WrapCounter(2)
x.inc()	//	两种调用类中方法的方式
x inc()

if(x.counter == x.max) {              // 没有声明成private的数据可以随意访问
    println("counter is about to wrap")
}

另外考虑以下代码,可以看出在参数声明和使用时可以通过指定参数名或者默认参数值,降低代码出错的可能性,并提高可读性

def myMethod(count: Int, wrap: Boolean, wrapValue: Int = 24): Unit = { ... }

myMethod(count = 10, wrap = false, wrapValue = 23)
myMethod(wrapValue = 23, wrap = false, count = 10)
myMethod(wrap = false, count = 10)
``

转载于:https://www.cnblogs.com/JamesDYX/p/10072885.html

相关文章:

  • database使用
  • 缓存技术在华为公有云环境中的挑战与应用
  • php的垃圾回收机制
  • 磕碰,擦伤了,紧急处理方法
  • 小程序如何动态修改标题navigationBarTitleText
  • Java调用第三方接口示范
  • Spring-boot和Spring-Cloud遇到的问题
  • IDEA破解图文教程
  • 搜索解决方案 -- ElasticSearch入门
  • 理解JSON Web Token (一)
  • 常用函数、文本处理函数、日期函数
  • VS code改英文
  • 怎样定制一款电视盒子软件系统
  • spring框架笔记
  • Linux命令集锦:ssh命令
  • chrome扩展demo1-小时钟
  • java取消线程实例
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 从伪并行的 Python 多线程说起
  • 工程优化暨babel升级小记
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端设计模式
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用docker-compose进行多节点部署
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 中文输入法与React文本输入框的问题与解决方案
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • #Spring-boot高级
  • $L^p$ 调和函数恒为零
  • (vue)页面文件上传获取:action地址
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @EnableAsync和@Async开始异步任务支持
  • @RequestBody的使用
  • []串口通信 零星笔记
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [hdu 1711] Number Sequence [kmp]
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [leetcode]Clone Graph
  • [Linux] 进程间通信基础
  • [Linux](15)线程基础,线程控制,线程的互斥与同步
  • [MySQL]日期和时间函数
  • [php] 数据结构算法(PHP描述) 快速排序 quick sort
  • [python]基本输出输入函数
  • [SystemC]Primitive Channels and the Kernel
  • [Ubuntu 18.04] RK3399搭建SSH服务实现远程访问