Redian新闻
>
Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

公众号新闻

作者 | Bruno Couriol
译者 | 刘雅梦
策划 | 丁晓昀

Borgo 是一种静态类型的语言,可以编译成 Go 语言,并在努力与现有的 Go 生态系统实现互操作。Borgo 语言为 Go 语言添加了代数数据类型、模式匹配、Option 和 Result 类型,以及很多受 Rust 启发的语法。Borgo 的编译器本身是用 Rust 实现的。

Borgo 的主要贡献者对 Borgo 的主要特征进行了解释:

我想要一种编写应用程序的语言,它比 Go 更具表现力,但比 Rust 更简单。

Go 虽然简单明了,但我经常希望它能提供更多的类型安全性。Rust 非常好用(至少对于单线程代码来说是这样),但它过于宽泛和复杂,有时甚至让人感到痛苦。

Borgo 是一种新的语言,可以转换成 Go 语言。它与现有的 Go 软件包完全兼容。

Borgo 语法类似于 Rust,带有可选的分号。

Go 因其简单、高效和对并发性的处理而迅速受到许多开发人员的欢迎。Go 的设计也有利于快速编译。截至 2024 年 5 月,该语言在 TIOBE 指数中排名第 8 位然而,开发人员经常指责 Go 在设计上是弱类型语言的缺点。Ian Lance Taylor 是 Go 的主要贡献者,他将弱类型视为一种特性而非缺陷

Go 故意使用弱类型系统,并且有很多可以用其他语言表达但不能用 GO 表达的限制。Go 通常鼓励通过编写代码来进行编程,而不是通过编写类型来进行编程。

然而,许多经验丰富的 Go 开发人员已经表示了对丰富类型系统的兴趣。例如,一位 Reddit 用户提到:

错误作为值是好的,但是缺少求和(sum)类型却会造成伤害。

缺少返回错误的语法糖会导致样板代码。

缺乏适当的类型定义意味着我不能随心所欲地使用类型安全性。

Borgo 语言的语法似乎在很大程度上受到了 Rust 的启发,在努力保持与现有 Go 库兼容性的同时,Borgo 为 Go 添加了关键的语言特性。下面的代码演示了 Borgo 的代数数据类型和模式匹配

use fmtenum NetworkState<T> {    Loading,    Failed(int),    Success(T),}struct Response {    title: string,    duration: int,}fn main() {    let res = Response {        title: "Hello world",        duration: 0,    }    let state = NetworkState.Success(res)    let msg = match state {        NetworkState.Loading => "still loading",        NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code),        NetworkState.Success(res) => res.title,    }    fmt.Println(msg)}

下面的代码示例演示了 Borgo 受 Rust 启发的 ResultOption 类型( strconv.Atoi 返回 Option<int>  类型,Reader.ReadString返回 Result<string, error> ):

use bufiouse fmtuse math.randuse osuse strconvuse stringsuse timefn main() {    let reader = bufio.NewReader(os.Stdin)    let secret = rand.Intn(100) + 1    loop {        fmt.Println("Please input your guess.")        let text = reader.ReadString('\n').Unwrap()        let text = strings.TrimSpace(text)        let guess = match strconv.Atoi(text) {            Ok(n) => n,            Err(_) => continue,        }        fmt.Println("You guessed: ", guess)        if guess < secret {            fmt.Println("Too small!")        } else if guess > secret {            fmt.Println("Too big!")        } else {            fmt.Println("Correct!")            break        }    }}

Borgo 还允许使用 操作符:

use fmtuse iouse osfn copyFile(src: string, dst: string) -> Result<(), error> {    let stat = os.Stat(src)?    if !stat.Mode().IsRegular() {        return Err(fmt.Errorf("%s is not a regular file", src))    }    let source = os.Open(src)?    defer source.Close()    let destination = os.Create(dst)?    defer destination.Close()    // 忽略复制的字节数    let _ = io.Copy(destination, source)?    Ok(())}

由于 Borgo 的编译器是用 Rust 编写的,开发人员需要用 cargo 来编译 Borgo 的源文件:

$ cargo run -- build

编译器将生成.go 文件,这些文件可以使用常用的 Go 工具链来运行:

# 如果需要,生成一个 go.mod 文件# $ go mod init foo$ go run .

最近,来自 Reddit 上的开发者的反应总体上是积极的,其中一位开发者 表示:

这几乎解决了我在工作中编写 Go 代码时最不喜欢的事情,我希望——至少——这些压倒性的积极回复(按照 HN 的标准——甚至考虑到典型的 Rust 偏见!)能够激励 Go 的维护人员考虑 / 优先考虑其中的一些特性。

Borgo 语言特性的完整列表可以在在线文档和 Borgo 的游乐场中找到。

原文链接:

https://www.infoq.com/news/2024/05/borgo-adds-types-to-go/

声明:本文为 InfoQ 翻译,未经许可禁止转载。

今日好文推荐

德国再次拥抱Linux:数万系统从windows迁出,能否避开二十年前的“坑”?

系统 bug 致百人入狱,砸了 2.8 亿元仍上云失败!二十年了,这家大企业被日本软件坑惨了

谷歌云删库宕机一周:千亿基金数据和备份被删光,技术负责人当场被裁,谷歌最后只说一句 Sorry?

SQL 50 周年了,但 SQL 之父已经“投靠”NoSQL 了

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
4天后截止!RBC科技类、数据类实习正在开岗中名利场||俞琤的70岁生日趴,千亿聚会巨星云集,数数SEVVA来了哪些人?多功能打底内裤,抗菌有凉感,舒适提臀,遮尴尬线不是,你还在随便设计数据库字段类型和长度?山姆热卖升级款!夏天必入这台科技型空气循环降温多功能扇,特价开团送2年换新,降温快、抑菌还有多功能灯加拿大春招丨Apple开启数据类intern岗位产品推荐 | 五合一多功能剃须刀,男生的这件神奇装备开团价只要99元中国的“琉球”,日本的“琉球”金融行业 | 商业银行替代数据应用综述——为银行找数据系列(一)CVPR 2024 | COCO数据集升级!字节提出新一代数据集COCONut五一嗨玩!带上多功能行李箱,开启便捷之旅!VS Code劲敌、Atom原作者主导、Rust编写的“最好”编辑器——Zed开始支持Linux加拿大终生难忘的十大体验!数数你去了几个?今日arXiv最热NLP大模型论文:斯坦福发布法律指令数据集LawInstruct,统一17个辖区24种语言【求职战报】全球金融交易平台Deutsche Börse Systems销售运营面试邀约!Rust 生态纯属炒作?3 年写了 10 万行代码的开发者吐槽:当初用 Rust 是被忽悠了固定收益 | 从编写大纲看PPP特许经营要点——评《政府和社会资本合作项目特许经营方案编写大纲(2024年试行版)》Sora场景转「3D资产」!浙大CAD&CG全重实验室提出文本转3D新SOTA:多功能、可拓展瓦尔登湖,或梭罗金融行业 | 零售业务替代数据初探——为银行找数据系列(二)回国杂记(2301)第一次乘坐台湾长荣航空公司的航班回国贵腾六月$350,000驶入夏季欢乐送、演唱会和更多!加拿大招聘丨5月18日截止!RBC科技类、数据类实习正在开岗中离职后可以删除自己编写的软件吗?多功能RNA分析,百度团队基于Transformer的RNA语言模型登Nature子刊Go-运算符+指针数据类型钛催化中心类型和分布的精准构筑:高效氧化脱硫│NSR发现家里实用小宝藏Linux 6.10 将支持 RISC-V 架构下的 Rust 编程语言Rust编写的Web开发框架——同时支持Node和Python这家世界模型公司发布中国版Sora级视频生成大模型,走向世界模型打造新一代数据引擎李硕归来,带着当成“遗稿”编写的《历史的游荡者》使用 Rust 编写,Zed 代码编辑器宣布将推出 Linux 平台 alpha 版本美股基本面 - 2024_03_19 * 晨报 * 奥特曼:马斯克不善于与他人合作 曾羞辱贝索斯丢掉首富。蒂森克虏伯考虑向凯雷【MR、TYP -> CX 10% Bonus, MR -> EY 20% Bonus (targeted)】转点奖励活动汇总
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。