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)
``
posted @ 2018-12-05 19:35  JamesDYX  阅读(1606)  评论(1编辑  收藏  举报