MoonBit月兔编程语言 现代编程思想 第二课 月兔开发与月兔中的表达式
�静态�指在程序运⾏之前的事物 �动态�指在程序运⾏之时的事物 ⽉兔拥有静态类型系统:在程序运⾏之前,编译器即会检查程序的类型是否定义良好 12 静态类型 每⼀个标识符都关联着唯⼀⼀个类型 �冒号�⽤于关联⼀个标识符和它的类型 x: Int a: Double s: String 每⼀个⽉兔表达式都有⼀个唯⼀的类型,这个类型由组成它的⼦表达式决定 13 静态类型检查 ⽉兔 故 (2 + 3) * (5 - 2) 15 25 数值绑定 let <标识符> : <类型> = <表达式> 数值绑定将⼀个名称(或者说标识符)赋予⼀个⽤表达式定义的值 类型声明多数时候可省略,⽉兔编译器会根据表达式类型进⾏推断 let x = 10 let y = "String" 对⼀个标识符进⾏多次绑定将会遮掩之前的值,⽽不会发⽣修改 26 表达式块 { 数值绑定 // 顶层(全局)即指定义在⼀个⽂件中所有表达式块外部定义的函数或标识符 2. let 顶层标识符 = 10 3. fn 顶层函数() { 4. // 本地(局部)即指某个表达式块内部的函数或标识符 5. fn 本地函数() { 6. 本地标识符 := 1 // 局部数值绑定可以简化 7. 本地标识符 // 表达式块的值 8. } 9. } 27 作⽤域 即指定义或数值绑定有效的范围0 码力 | 39 页 | 1.53 MB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第三课 函数, 列表与递归 add_char('m', "oonbit") 因为 Char::from_int(109) 'm' 'm'.to_string() + "oonbit" 替换表达式块中的标识符 "m" + "oonbit" 因为 m.to_string() "m" "moonbit" 我们可以通过模式匹配来分情况查看列表的内部结构 match <表达式> { <模式1> => <表达式> <模式2> => <表达式> } 模式可以⽤数据的构造⽅式定义。模式中定义了标识符,其作⽤域为对应表达式 1. fn head_opt(list: List[Int]) -> Option[Int] { 2. match list { 3. Nil => None 4 Cons(head, tail) => Some(head) 5. } 6. } 19 模式匹配结果的化简 简化待匹配的表达式 从上到下依次匹配模式 匹配成功后,根据模式定义替换表达式中的标识符 简化表达式 1. fn head_opt(list: List[Int]) -> Option[Int] { 2. match list { 3. Nil => None 4.0 码力 | 42 页 | 587.59 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第六课 泛型与高阶函数
替换表达式中的标识符 let x: Int = add_two(2) add_two(2) plus_one(plus_one(2)) 替换表达式中的标识符 plus_one(2) + 1 替换表达式中的标识符 (2 + 1) + 1 替换表达式中的标识符 3 +0 码力 | 27 页 | 2.56 MB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第四课 多元组, 结构体,枚举类型 match i { 3. 0 => true 4. 1 | 2 | 3 => false 5. _ => false 6. } 7. } 构造器中可以嵌套模式进⾏匹配,或定义标识符绑定对应结构 1. fn contains_zero(l: List[Int]) -> Bool { 2. match l { 3. Nil => false 4. Cons(0 Int)) -> Int { 2. match pair { 3. (first, second) => first 4. } 5. } 结构体模式匹配可以匹配部分字段;可以不⽤另外命名标识符 1. fn baby_name(info: PersonalInfo) -> Option[String] { 2. match info { 3. { age: 0, .. } => zip(tl, tl2)) 6. } 7. } 14 本地定义中的匹配 我们还可以在本地定义中利⽤模式进⾏匹配 let <模式> = <表达式> 此时会根据模式将表达式的值的⼦结构绑定到定义的标识符上,如: let (first, second) = (1, 2) // first == 1, second == 2 let Cons(1, x) = List::Cons(1, Nil) //0 码力 | 26 页 | 435.86 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第七课 命令式编程:命令,可变数据结构,循环 现代编程思想 命令式编程 Hongbo Zhang 1 函数式编程 到此为⽌,我们介绍的可以归类于函数式编程的范畴 对每⼀个输⼊,有着固定的输出 对于标识符,我们可以直接⽤它所对应的值进⾏替代⸺引⽤透明性 开发实⽤的程序,我们需要⼀些计算之外的�副作⽤� 进⾏输⼊输出 修改内存中的数据等 这些副作⽤可能导致多次执⾏的结果不⼀致 2 引⽤透明性 我们可以定义如下数据绑定和函数 mut ref = { val : 1 } ref = { val : 10 } ref ref 1 1 val val 10 val 9 别名 指向相同的可变数据结构的两个标识符可以看作是别名 1. fn alter(a: Ref[Int], b: Ref[Int]) { 2. a.val = 10 3. b.val = 20 4. } 5. 6. fn init } 8. alter(x, x) 9. println(x.val.to_string()) // x.val的值将会被改变两次 10. } 10 别名 指向相同的可变数据结构的两个标识符可以看作是别名 x val 1 alter(x, x) a init b x val 10 alter(x, x) a init b x val 20 alter(x, x)0 码力 | 23 页 | 780.46 KB | 1 年前3
共 5 条
- 1













