zoukankan      html  css  js  c++  java
  • 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)
    ``
  • 相关阅读:
    python 时间 时间戳 转换
    jsp mysql
    multi struts config
    mysql start
    struts logic tag
    jsp setProperty
    jstl fn tag
    write jsp tag
    use Bean in JSP
    jsp mysql JavaBean
  • 原文地址:https://www.cnblogs.com/JamesDYX/p/10072885.html
Copyright © 2011-2022 走看看