前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

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

作者头像
深度学习与Python
发布于 2024-05-22 10:54:56
发布于 2024-05-22 10:54:56
15103
代码可运行
举报
运行总次数:3
代码可运行
作者 | 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 的代数数据类型和模式匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use fmt
enum 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> ):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use bufio
use fmt
use math.rand
use os
use strconv
use strings
use time
fn 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 还允许使用 操作符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use fmt
use io
use os
fn 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 的源文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cargo run -- build

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果需要,生成一个 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 翻译,未经许可禁止转载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是python爬虫。
简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前;
7537367
2020/07/17
8390
【Python爬虫】初识爬虫(1)
之前写了两篇关于爬虫的文章微信好友大揭秘,赵雷到底在唱什么,纯粹是自己的兴趣引导自己学习爬虫,关注里应该有好多对爬虫感兴趣的小伙伴,为了巩固自己的爬虫知识,从今天开始更新python爬虫这个基础教程,自己准备了挺长时间整理了自己的学习笔记,希望能给初学者带来一点帮助,在这个教程里我会给大家介绍爬虫常用的库跟大家做几个有意思的Demo。这篇文章主要是让大家了解爬虫和爬虫需要的基础知识,话不多说,我们开始吧。
PM小王
2019/07/02
1.8K0
【Python爬虫】初识爬虫(1)
Python爬虫原理
简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前;
用户7678152
2020/08/19
9701
一、爬虫基本原理
一 爬虫是什么 #1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建立的目的? 互联网的核心价值在于数据
用户1214487
2018/01/24
8030
一、爬虫基本原理
爬虫之爬虫简介与request请求库
爬虫协议:规定了什么东西网站让爬,什么东西不让爬,查看方式:网址/robots.txt 如
GH
2020/03/19
1.2K0
python爬虫---从零开始(一)初识爬虫
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。互联网犹如一个大蜘蛛网,我们的爬虫就犹如一个蜘蛛,当在互联网遇到所需要的资源,我们就会爬取下来,即为爬虫是一个请求网站并且提取数据的自动化程序。
小菜的不能再菜
2019/09/18
5890
python爬虫---从零开始(一)初识爬虫
Python之Urllib使用
如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小
鱼找水需要时间
2023/02/16
4560
Python之Urllib使用
Python爬虫入门这一篇就够了
所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。
py3study
2020/01/15
9290
一篇万字博文带你入坑爬虫这条不归路 【万字图文】
大家好,又见面了,我是你们的朋友全栈君。 👻最近,很多粉丝私信我问——爬虫到底是什么?学习爬虫到底该从何下手?👻 😬其实,我想说的也是曾经的我身为小白的时候某些大牛对我说过的——很多时候我们都有一颗想要学习新知识的心,却总是畏惧于对想要学习内容的无知,这也是多数人失败甚至后悔终身的:因为他们从来没有开始过!😬 😜借一位几年前带我入坑的前辈的话——坑就在你面前,别总是犹豫徘徊,大胆一点:向前一步,入了这个坑,莽着头就是往前冲,别多想,别回头,终有一天——>你也会成为别人的前辈!😜 ---- 今日份鸡
全栈程序员站长
2022/07/22
2650
一篇万字博文带你入坑爬虫这条不归路 【万字图文】
三个Python爬虫版本,带你轻松入门爬虫
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,
python学习教程
2019/10/10
5470
三个Python爬虫版本,带你轻松入门爬虫
爬虫的基本原理
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,
py3study
2020/01/20
1.7K0
三个Python爬虫版本,爬取校花网,轻松入门爬虫
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/08/06
5050
轻松入门Python爬虫,三个爬虫版本,带你以各种方式爬取校花网
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,
python学习教程
2020/03/09
7010
轻松入门Python爬虫,三个爬虫版本,带你以各种方式爬取校花网
Python|爬取短视频
python是一种非常好用的爬虫工具。对于大多数的爬虫小白来说,python是更加简洁,高效的代码。今天就用实际案例讲解如何爬取动态的网站视频。
算法与编程之美
2020/03/25
1.8K0
数据采集技术python网络爬虫_精通Python网络爬虫
网络爬虫(Crawler)又称网络蜘蛛,或者网络机器人(Robots). 它是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。换句话来说,它可以根据网页的链接地址自动获取网页内容。如果把互联网比做一个大蜘蛛网,它里面有许许多多的网页,网络蜘蛛可以获取所有网页的内容。 爬虫是一个模拟人类请求网站行为, 并批量下载网站资源的一种程序或自动化脚本。
全栈程序员站长
2022/09/27
1.9K0
数据采集技术python网络爬虫_精通Python网络爬虫
python爬虫从入门到放弃(二)之爬虫的原理
本文介绍了如何通过Python的Selenium库和Pandas库实现网页数据的爬取,并通过实例讲解了具体的操作步骤。同时,本文还提供了爬取数据时可能遇到的问题及解决方法,如JavaScript渲染问题、数据保存问题等。
coders
2018/01/04
1.7K0
python爬虫从入门到放弃(二)之爬虫的原理
Python爬虫的基本原理
我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。
仲君Johnny
2024/02/03
4120
Python爬虫的基本原理
Python爬虫之基本原理
网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
IT派
2018/07/30
1.1K0
Python爬虫之基本原理
Python爬虫基本知识:什么是爬虫?
豌豆贴心提醒,本文阅读时间5分钟 一、网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字。 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。 网络蜘蛛是通过网页的链接地址来寻找网页的。 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。 如果把整个互联网当成一个请叫我汪海网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。 这样看
小小科
2018/05/04
8490
Python爬虫基本知识:什么是爬虫?
【收藏】一文读懂网络爬虫!
在当前数据爆发的时代,数据分析行业势头强劲,越来越多的人涉足数据分析领域。进入领域最想要的就是获取大量的数据来为自己的分析提供支持,但是如何获取互联网中的有效信息?这就促进了“爬虫”技术的飞速发展。
昱良
2019/07/04
1.5K0
相关推荐
什么是python爬虫。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验