MoonBit 周报 Vol.52:增加类型别名的支持、错误类型声明方式说明、MoonBit AI 支持生成文档等!
weekly 2024-08-05
MoonBit更新
- JSON字面量支持array spread。
let xs: Array[@json.JsonValue] = [1, 2, 3, 4]
let _: @json.JsonValue = [1, ..xs]
- 增加了类型别名的支持,主要是为了渐进式代码重构和迁移,而不是某种给类型简短名字的机制。例如,假设需要把
@stack.Stack重命名为@stack.T,一次性完成迁移需要修改大量使用@stack.Stack的地方,对于大项目很容易产生 conflict,如果有第三方包使用了@stack.Stack,则会直接造成 breaking change。使用 type alias,则可以在重命名后留下一个@stack.Stack的 alias,使现有代码不会失效:
/// @alert deprecated "Use `T` instead"
pub typealias Stack[X] = T[X]
接下来,可以渐进式地逐步迁移对 @stack.Stack 的使用、给第三方用户时间去适配新的名字。直到迁移全部完成,再移除 type alias 即可。除了类型重命名,typealias 还可用于在包之间迁移类型定义等等
- 增加了给 trait object 定义新的方法的支持:
trait Logger {write_string(Self, String) -> Unit
}trait CanLog {output(Self, Logger) -> Unit
}// 给 trait object 类型 `Logger` 定义新的方法 `write_object`
fn write_object[Obj : CanLog](self : Logger, obj : Obj) -> Unit {obj.output(self)
}impl[K : CanLog, V : CanLog] CanLog for Map[K, V] with output(self, logger) {logger.write_string("Map::of([")self.each(fn (k, v) {// 使用 `Logger::write_object` 方法来简化logger..write_string("(")..write_object(k)..write_string(", ")..write_object(v).write_string(")")})logger.write_string("])")
}
- 【breaking change】在可能返回错误的返回值类型
T!E中,错误类型E只能是使用type!关键字声明具体的错误类型,目前支持以下两种声明方式:
type! E1 Int // error type E1 has one constructor E1 with an Integer payload
type! E2 // error type E2 has one constructor E2 with no payload
函数声明中可以使用上述具体的错误类型来进行标注,并通过使用 raise 来返回具体的错误,比如
fn f1() -> Unit!E1 { raise E1(-1) }
fn f2() -> Unit!E2 { raise E2 }
- 添加了内置的 Error 类型作为默认的错误类型,可以在函数声明中使用以下几种等价的声明方式来表明函数会返回 Error 类型的错误,比如:
fn f1!() -> Unit { .. }
fn f2() -> Unit! { .. }
fn f3() -> Unit!Error { .. }
对于匿名函数和矩阵函数,可以通过使用 fn! 来标注该函数可能返回 Error 类型的错误,比如
fn apply(f: (Int) -> Int!, x: Int) -> Int! { f!(x) }fn main {try apply!(fn! { x => .. }) { _ => println("err") } // matrix functiontry apply!(fn! (x) => { .. }) { _ => println("err") } // anonymous function
}
通过 raise 和 f!(x) 这种形式返回的具体的错误类型可以向上 cast 到 Error 类型,比如
type! E1 Int
type! E2
fn g1(f1: () -> Unit!E1) -> Unit!Error {f1!() // error of type E1 is casted to Errorraise E2 // error of type E2 is casted to Error
}
错误类型可以被模式匹配,当被匹配的类型是 Error 的时候,模式匹配的完备性检查会要求添加使用 pattern _ 进行匹配的分支,而当其是某个具体的错误类型的时候则不需要,比如
type! E1 Int
fn f1() -> Unit!E1 { .. }
fn f2() -> Unit!Error { .. }
fn main {try f1!() { E1(errno) => println(errno) } // this error handling is completetry f2!() {E1(errno) => println(errno)_ => println("unknown error")}
}
此外,在 try 表达式中,如果使用了不同种类的错误类型,那么整个 try 表达式可以返回的错误类型会按照 Error 类型进行处理,比如
type! E1 Int
type! E2
fn f1() -> Unit!E1 { .. }
fn f2() -> Unit!E2 { .. }
fn main { try {f1!()f2!()} catch {E1(errno) => println(errno)E2 => println("E2")_ => println("unknown error") // currently this is needed to ensure the completeness}
}
我们会在后续的版本中对此进行改进,以使得完备性检查可能更加精确
- 添加了 Error bound,以在泛型函数中对泛型参数加以约束,使得其可以作为错误类型出现在函数签名中,比如
fn unwrap_or_error[T, E: Error](r: Result[T, E]) -> T!E {match r {Ok(v) => vErr(e) => raise e}
}
标准库更新
Bigint变为builtin类型
构建系统更新
-
支持 debug 单个.mbt文件
-
moon test支持包级别的并行测试 -
moon.mod.json增加root-dir字段,用于指定模块的源码目录,只支持指定单层文件夹,不支持指定多层文件夹。moon new会默认指定root-dir为src,exec 和 lib 模式的默认目录结构变为:
exec
├── LICENSE
├── README.md
├── moon.mod.json
└── src ├── lib │ ├── hello.mbt │ ├── hello_test.mbt│ └── moon.pkg.json└── main ├── main.mbt└── moon.pkg.json lib
├── LICENSE
├── README.md
├── moon.mod.json
└── src ├── lib │ ├── hello.mbt│ ├── hello_test.mbt│ └── moon.pkg.json├── moon.pkg.json└── top.mbt
工具链更新
- MoonBit AI 支持生成文档

相关文章:
MoonBit 周报 Vol.52:增加类型别名的支持、错误类型声明方式说明、MoonBit AI 支持生成文档等!
weekly 2024-08-05 MoonBit更新 JSON字面量支持array spread。 let xs: Array[json.JsonValue] [1, 2, 3, 4] let _: json.JsonValue [1, ..xs]增加了类型别名的支持,主要是为了渐进式代码重构和迁移,而不是某种给类型简短名字的机制。例如…...
Android开发之事件分发
#来自ウルトラマンゼロ(哉阿斯) 1 Activity 构成 平常布局展示在ContentView中。 2 事件分发 事件分发的本质其实就是把事件(Touch)封装成 MotionEvent 类,然后传递给 View 的层级处理。 MotionEvent 事件类型主要有…...
PyTorch深度学习实战(2)——PyTorch快速入门
PyTorch的简洁设计使得它易于入门,在深入介绍PyTorch之前,本文先介绍一些PyTorch的基础知识,以便读者能够对PyTorch有一个大致的了解,并能够用PyTorch搭建一个简单的神经网络。 1 Tensor Tensor是PyTorch中最重要的数据结构&#…...
ServletConfig、ServletContext超详细讲解
文章目录 前言一、ServletConfig的使用1.ServletConfig定义2.ServletConfig的API3.ServletConfig的测试代码: 二、 ServletContext的使用1.ServletContext定义2.ServletContext如何用3. ServletContext其他重要API 总结 前言 ServletConfig接口代表了Servlet的配置信…...
【文献阅读】GraphAny: A Foundation Model for Node Classification on Any Graph
Abstract 可以执行任何新任务而无需特定训练的基础模型已经在视觉和语言应用中引发了机器学习的革命。然而,涉及图结构数据的应用仍然是基础模型面临的一个难题,因为每个图都有独特的特征和标签空间。传统的图机器学习模型,如图神经网络&…...
动态规划.
目录 (一)递归到动规的一般转化方法 (二)动规解题的一般思路 1. 将原问题分解为子问题 2. 确定状态 3. 确定一些初始状态(边界状态)的值 4. 确定状态转移方程 (三)能用动规解…...
PHP常用函数
字符串 strlen()获取字符串长度strpos()在字符串内查找一个字符或一段指定的文本,返回第一次出现的位置或falsestripos()同上,但不区分大小写strrpos()同上上,返回最后一…...
完全用python 实现消息中间件4
为了进一步完善这个消息中间件,我们可以添加以下功能: 消息确认:客户端可以发送一个确认消息,表明消息已经被正确接收。消息队列:使用一个队列来存储消息,而不是直接存储在字典中。多消费者支持࿱…...
公司新来的两个Java后端,因题背太熟轻松过面试?
以前面试是背八股文,而2024年的后端面试都是流行问场景题!建议大家把面试想简单一点,顺的场景题直接给有需要的人,希望能对大家有所帮助! 由于平台篇幅原因,很多java面试资料内容展示不了,需要…...
Pinia状态管理库
为了跨组件传递JWT令牌,我们就会利用Pinia状态管理库,它允许跨组件或页面共享状态。 使用Pinia步骤: 安装pinia:cnpm install pinia 在vue应用实例中使用pinia 在src/stores/token.js中定义store 在组件中使用store 1.在main.js文…...
利用ffmpeg转码视频为gif图片,调整gif图片的大小
【1】压缩gif图片大小 一般发布技术文章的时候经常要插入GIF图演示软件效果,但是一些编辑器总是限制大小,但是录制的时候可能一不小心就搞大了。 要将 GIF 图片大小限制在 10MB 内,可以使用 FFmpeg 进行压缩。 以下是一个ffmpeg的命令&…...
【Java 第四篇章】流程控制、容器
一、流程控制 1、概念 //1.if//2.if...else//3.if...else if...else...//4.switch//5.跳出循环体:break和continue2、语法 //1. ifif(条件表达式){//执行代码块}//2.if...elseif(条件表达式){//条件表达式为真执行的代码块} else {//条件表达式为假执行的代码块}//…...
华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用
华为开发者大会2024(HDC 2024)在东莞松山湖圆满结束,期间华为云主办的“全域Serverless时代:技术创新引领,赋能行业实践”专题论坛,向广大开发者传递了Serverless领域的前沿思考和实践,现场座无…...
除自身以外数组的相乘 C++
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂…...
Element UI 如何配置文件来设置全局的语言选项。
Element UI 允许你通过配置文件来设置全局的语言选项,这样你可以方便地切换组件的语言。以下是如何配置 Element UI 以设置全局语言选项的步骤: 1. 安装 Element UI 确保你已经安装了 Element UI。 npm install element-ui --save2. 引入语言包 Elem…...
Windows 常用命令集锦
目录 一、文件和目录管理 1.1 文件操作 1.2 目录操作 二、系统信息 2.1 基本系统信息 2.2 硬件信息 三、网络管理 3.1 基本网络命令 3.2 网络诊断 四、进程管理 4.1 查看进程 4.2 管理进程 五、磁盘管理 5.1 磁盘操作 5.2 磁盘分区 六、IIS操作 通过上述命令&am…...
第一阶段面试问题(后半部分)
1. c语言中const *p的用法 (1)const int *p; 或 int const *p; 指向常量整数的指针,通过这个指针不能修改它所指向的整数值,但可以修改指针本身来指向其他地址 const int a 10; const int *p &a; // *p 20; // 错误&…...
【AIGC】ComfyUI入门-使用ComfyUI_MagicClothing插件在生成图片时候出现的问题
最近想自己实现自动换装的工作流,在使用ComfyUI_MagicClothing插件的时候,出现了一个奇怪的问题。这个问题不是插件的问题,是环境配置问题。 问题内容如下: Exception during processing!!! D:\a_work\1\s\onnxruntime\python\onnxruntime_pybind_state.cc:891 onnxrunti…...
巴黎奥运会8K转播科技为国产品牌自主研发设计
这个夏天,顶流是属于巴黎奥运会中国队的。 20枚金牌、15枚银牌、12枚铜牌......这个数字正随着赛事推进而不停在增加。赛场之上,中国健儿奋力拼搏、捷报频传,令人热血沸腾;赛场之外,另一支来自中国企业的“奥运选手”…...
【Material-UI】Button 组件中的图标和标签按钮(Buttons with Icons and Label)详解
文章目录 一、基础用法1. 左侧图标(startIcon)2. 右侧图标(endIcon) 二、图标与标签的搭配三、高级用法和最佳实践1. 自定义图标2. 视觉一致性3. 动态图标 四、总结 在现代用户界面设计中,图标在提高用户体验ÿ…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
