月报 Vol.02:新增条件编译属性 cfg、#alias属性、defer表达式,增加 tuple struct 支持
语言更新
-
新增条件编译属性 cfg。可以根据后端等条件进行文件内的条件编译。
#cfg(any(target="js", target="wasm-gc")) let current_target = "js | wasm-gc"
-
新增
#alias
属性,目前可以给方法或函数创建别名,并支持标注废弃。后续支持更多场景。#alias(combine, deprecated="use add instead") fn Int::add(x : Int, y : Int) -> Int { x + y } test { let _ = Int::add(1, 2) let _ = Int::combine(1, 2) }
-
新增
defer
表达式。提供了一个基于词法作用域的资源清理功能。当程序以任何方式离开defer expr; body
中的body
时,expr
都会被运行fn main { defer println("End of main") { defer println("End of block1") println("block1") } for i in 0..<3 { defer println("End of loop \{i}") if i == 2 { break // `break` 等也能触发 `defer` } println("Looping \{i}") } return }
block1 End of block1 Looping 0 End of loop 0 Looping 1 End of loop 1 End of loop 2 End of main
目前,
defer expr
的expr
里不能抛出错误或调用async
函数。expr
里不能使用return
/break
/continue
等控制流跳转构造 -
Native 后端的
Bytes
的末尾现在永远会有一个额外的'\0'
字节,因此现在Bytes
可以直接当作 C string 传给需要 C string 的 FFI 调用。这个额外的'\0'
字节不计入Bytes
的长度,因此现有代码的行为不会有任何变化 -
调整可选参数的语法,默认参数现在可以依赖前面的参数(之前这一行为被废弃了,因为它和 virtual package 不兼容,但现在我们找到了在兼容 virtual package 的前提下支持这种复杂默认值的方式)。另外,我们统一了有默认值(
label~ : T = ..
)和没有默认值(label? : T
)的可选参数:现在,对于函数的调用者来说,这两种默认参数不再有区别,并且都支持下列调用方式:-
不提供参数,使用默认值
-
通过
label=value
的形式显式提供参数 -
通过
label?=opt
的形式调用,语义是:如果opt
是Some(value)
,等价于label=value
。如果opt
是None
,等价于不提供这个参数
-
-
调整自动填充参数的语法,改用
#callsite(autofill(...))
属性替代原有语法// 原版本 pub fn[T] fail(msg : String, loc~ : SourceLoc = _) -> T raise Failure { ... } // 现版本 #callsite(autofill(loc)) pub fn[T] fail(msg : String, loc~ : SourceLoc) -> T raise Failure { ... }
-
废弃 newtype,增加 tuple struct 支持
// 旧语法,运行时等价于 Int type A Int fn get(a : A) -> Int { a.inner() } // 新语法,运行时依然等价于 Int struct A(Int) fn get(a : A) -> Int { a.0 } struct Multiple(Int, String, Char) fn use_multiple(x: Multiple) -> Unit { println(x.0) println(x.1) println(x.2) } fn make_multiple(a: Int, b: String, c: Char) -> Multiple { Multiple(a, b, c) }
-
当 tuple struct 中类型数量为 1 个的时候,tuple struct 等价于原有的 newtype。因此,当 newtype 的 underlying type 不是 tuple 的时候,formatter 目前会自动将旧语法迁移至新语法。为了便于迁移,这种情况下的 tuple struct 也提供了一个
.inner()
方法,之后会 deprecated 掉并移除 -
当 tuple struct 中类型数量超过 1 个的时候,tuple struct 和原有的 tuple newtype 的区别在于:
-
tuple struct 不能由直接通过 tuple 构造
-
tuple struct 不能通过
.inner()
方法得到一个 tuple
-
-
如果需要可以直接和 tuple 互相转换的 tuple struct,可以使用:
struct T((Int, Int)) fn make_t(x: Int, y: Int) -> T { (x, y) } fn use_t(t: T) -> (Int, Int) { t.0 }
-
不过这种情况下访问具体元素时,需要 t.0.0
或者 t.0.1
进行访问
-
由于主要用途为数据存储和
@json.inspect
等功能,derive(FromJson, ToJson)
将不再提供高级格式调整参数。目前保留的格式参数为每个字段的rename
(重命名)、批量重命名和 enum 的格式选择style
,其余参数均将被移除。-
style
的可选项为legacy
和flat
。后者简化了表示,适用于@json.inspect
等场景。目前所有 enum 都必须选择其中一个 style 使用。 -
如果需要自定义 JSON 的格式,请自行实现
FromJson
和ToJson
两个 trait。
///| Flat test { @json.inspect(Cons(1, Cons(2, Nil)), content=["Cons", 1, ["Cons", 2, "Nil"]]) } ///| Legacy test { @json.inspect(Cons(1, Cons(2, Nil)), content={ "$tag": "Cons", "0": 1, "1": { "$tag": "Cons", "0": 2, "1": { "$tag": "Nil" } }, }) }
-
工具链更新
-
新增
moon coverage analyze
功能,提供更直观的覆盖率报告Total: 1 uncovered line(s) in 2 file(s) 1 uncovered line(s) in src/top.mbt: | fn incr2(x : Int, step? : Int = 1) -> Int { 12 | x + step | ^^^^^^^^ <-- UNCOVERED | } … Total: 1 uncovered line(s) in 2 file(s)
-
现在
moon test --target js
在 panic 的时候,能根据 sourcemap 显示原始位置了test username/hello/lib/hello_test.mbt::hello failed: Error at $panic ($ROOT/target/js/debug/test/lib/lib.blackbox_test.js:3:9) at username$hello$lib_blackbox_test$$__test_68656c6c6f5f746573742e6d6274_0 ($ROOT/src/lib/hello_test.mbt:3:5) at username$hello$lib_blackbox_test$$moonbit_test_driver_internal_execute ($ROOT/src/lib/__generated_driver_for_blackbox_test.mbt:41:9)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
开源重构汽车:从孤岛到协作的生态演进
智能汽车的软件正迅速成为核心价值载体:其代码规模已达数亿行、成本占比迅速上升,与此同时开源正在成为推动技术品牌、成本控制、效率提升、生态协作的关键手段,而全球及中国的车企正在通过分层架构、自主研发与行业协作融合大模型技术,共同推进“软件定义汽车“时代的到来。 一辆有智能辅助驾驶功能的汽车需要多少行代码? 到今天,如果考虑车上的所有软件,这个答案已趋近于 7 亿行。同时,软件也正在成为整车 BOM 表里单价最高的“零部件”。德勤报告测算,2030 年软件成本占整车 BOM 比重将从目前不到 10% 增长到 50%,包括程序开发、AI 算法、操作系统、控制器和芯片等。 “软件定义汽车”的趋势愈加明晰。而开源作为现代软件世界中提升协同效率、降低基础技术研发成本的大功臣,自然也被引入到汽车软件的场景中,扮演着至关重要的角色。据相关调研数据显示,汽车行业中代码库的开源代码占比近 70%,广泛应用在基础软件、座舱软件等不同的场景中。 从开源协作的角度看,近期海内外的车企、科技企业等都有引人注目的动作:除了我们近两年看到的普华软件、国科础石、睿赛徳、理想汽车等面向基础操作系统的开源,不久前,包括大众...
-
下一篇
微软开源的 MCP 教程「GitHub 热点速览」
上周,最大的开源新闻就是 OpenAI 开源了 gpt-oss 推理模型。尽管模型能力不俗,但似乎并未带来"颠覆性"突破,也许是我们对大模型开源已经有些"审美疲劳"了。 说回本周的热门开源项目,KittenTTS 是一款小巧却高质量的英文文本转语音模型 ,凭借自然流畅的语音效果,一周内收获了 6k Star。谷歌开源的 LangExtract 则利用大模型,通过简短提示和少量示例,能从非结构化文本中高效提取结构化信息。此外,微软开源的 MCP 教程,系统地帮助开发者掌握 MCP 原理与最佳实践。还有无需编写代码、可一键集成登录界面的身份认证中间件 Tinyauth。 最后,精准的网页内容截图库 snapdom 和开源的网页双语对照翻译浏览器插件,也是不错的开源项目。 本文目录 热门开源项目 1.1 开源的零代码身份认证中间件:Tinyauth 1.2 开源的网页双语对照翻译工具:kiss-translator 1.3 基于大模型的智能文本提取库:LangExtract 1.4 轻量小巧的文本转语音模型:KittenTTS 1.5 微软开源的 MCP 教程:mcp-for-beginne...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 面试大杂烩
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境