MoonBit月兔编程语言 现代编程思想 第七课 命令式编程:命令,可变数据结构,循环 <定义变量及初始值> 2. while <针对变量判断是否继续循环>, <对变量进⾏迭代> { 3. <需要重复执⾏的命令> 4. } 例如,我们可以反复执⾏n次输出操作 1. let mut i = 0 2. while i < 2, i = i + 1 { 3. println("Output") 4. } // 重复输出2次 12 循环 我们进⼊循环时 判断是否满⾜继续循环的条件 执⾏命令 等于 0 2. while i < 2, i = i + 1 { // <-- 此处,我们判断 i < 2 是否为真 3. println("Output") // <-- 0 < 2,因此继续执⾏,输出第⼀次 4. } // <-- 此时,我们执⾏i = i + 2 13 循环 我们进⼊循环时 判断是否满⾜继续循环的条件 执⾏命令 对变量进⾏迭代 重复以上过程 例如 1. // 等于 1 2. while i < 2, i = i + 1 { // <-- 此处,我们判断 i < 2 是否为真 3. println("Output") // <-- 1 < 2,因此继续执⾏,输出第⼆次 4. } // <-- 此时,我们执⾏i = i + 2 14 循环 我们进⼊循环时 判断是否满⾜继续循环的条件 执⾏命令 对变量进⾏迭代 重复以上过程 例如 1. //0 码力 | 23 页 | 780.46 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第八课 队列:可变数据实现
超出队尾则转回队⾸ 12. self.length = self.length + 1 13. self 14. } 问题:如果元素数量超出了数组⻓度 7 循环队列 队列的扩容操作 我们⾸先判断是否需要扩容 我们创建新的更⻓的数组,并将原有数据进⾏复制 1. fn push(self: Queue, t: Int) -> Queue { 2. if self.length == self LinkedList val next 1 Some Node val next 2 Some Node val next 3 None Node 13 单向链表 当我们添加时,我们判断链表是否⾮空 若⾮空,则向队尾添加,并维护链表关系 1. fn push[T](self: LinkedList[T], value: T) -> LinkedList[T] { 2. let0 码力 | 19 页 | 314.79 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机
Local_Get(String); Local_Set(String) // 取值、设值 6. If(Int, List[Instruction], List[Instruction]) // 条件判断 7. } 8 类型定义 函数 1. struct Function { 2. name : String 3. // 只考虑⼀种数据类型,故省略每个数据的类型,只保留名称和数量 4 tail rest Instruction Stack i32(x) i32(y) tail rest Instruction i32(x + y) Stack 26 解释器构造 条件判断时,根据分⽀取出对应代码 1. (Cons(Plain(If(_, then, else_)), tl), Cons(Val(I32(i)), rest)) => 2. Some(State::{0 码力 | 31 页 | 594.38 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第十一课 案例:语法解析器与Tagless Final Option[(V, String)] { 6. (self.0)(str) 7. } 我们简化处理报错信息以及错误位置(可以使⽤ Result[A, B] ) 6 解析器组合⼦ 最简单的解析器 判断下⼀个待读取的字符是否符合条件,符合则读取并前进 1. fn pchar(predicate : (Char) -> Bool) -> Lexer[Char] { 2. Lexer(fn(input) ( 5) ) ")) 8. } 我们成功地分割了字符串 - 10123 - + - 523 103 ( 5 ) ) 但这不符合数学表达式的语法 13 语法分析 对单词流进⾏分析,判断是否符合语法 输⼊:单词流 输出:抽象语法树 1. expression = Value / "(" expression ")" 2. expression =/ expression "+"0 码力 | 25 页 | 400.29 KB | 1 年前3
WAF - 是时候跟正则表达式说再见现有WAF的解决方案 基于语义检测的WAF 正则:select.*from Improved 正则只关注‘Select id,name from’, 忽略了上下文的信息 。在做注入判断时,对输入进 行片面的理解,导致误报。 整个输入作为一个整体,尝试 理解意图。 How? 文本:What’s problem about ‘Select id,name from’, give0 码力 | 24 页 | 1.66 MB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第十三课 案例:神经网络
案例:鸢尾花 鸢尾花数据集是机器学习中的"Hello World" 1936年发布 包含对3种鸢尾花的测量,各有50个样本 每个样本包含4项特征:花萼与花瓣的⻓度和宽度 ⽬标 通过特征,判断属于哪⼀类鸢尾花 构建并训练神经⽹络,正确率95%以上 2 神经⽹络 神经⽹络是机器学习的⼀种 模拟⼈的⼤脑神经结构 单个神经元通常有 多个输⼊ ⼀个输出 神经元在达到⼀定阈值后激活0 码力 | 17 页 | 521.66 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第九课 接口
Key) -> Option[Value] 10 表:利⽤接⼝实现 表的简易实现 利⽤列表+⼆元组存储键值对 添加/更新时向列表前添加键值对 查询时从列表前开始,找到键即返回 简易实现需要判断存储的键值对是否为搜索的键 键应当满⾜相等接⼝ 1. fn get[Key: Eq, Value](map: Map[Key, Value], key: Key) -> Option[Value]0 码力 | 16 页 | 346.04 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第五课 数据类型:树、二叉树、二叉搜索树、AVL树
先对基本情形进⾏处理:空树 再对递归情形进⾏处理,并递归 1. fn dfs_search(target: Int, tree: IntTree) -> Bool { 2. match tree { // 判断当前访问的树 3. Empty => false // 若为空树,则已抵达最深处 4. Node(value, left, right) => // 否则,再对⼦树轮流遍历 5.0 码力 | 29 页 | 1015.26 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第十课 哈希表与闭包
: V) -> Unit { 2. let index = find_slot(map, key) // 利⽤辅助函数进⾏查找 3. if map.occupied[index] { // 判断是找到了对应键还是找到了空位 4. map.values[index].value = value // 找到了对应的键则进⾏更新 5. } else { // 否则将键值对加⼊空位 60 码力 | 27 页 | 448.83 KB | 1 年前3
共 9 条
- 1













