A preview of Roc 0.1.0

Lobsters Hottest 工具

摘要

Richard Feldman presents a preview of Roc 0.1.0 at a functional programming meetup, showcasing a GUI demo with hot code reloading and discussing the language's goals of being fast, friendly, and functional.

<p>Starts at 4:21</p> <p><a href="https://lobste.rs/s/utpgi9/preview_roc_0_1_0">Comments</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/13 21:25

# A preview of Roc 0.1.0 **Channel:** youtu.be via skykanin Source: [https://youtu.be/a7qEOtkkDb8](https://youtu.be/a7qEOtkkDb8) ## Description <p>Starts at 4:21</p> <p><a href="https://lobste.rs/s/utpgi9/preview_roc_0_1_0">Comments</a></p> ## Transcript 大家好,热烈欢迎来到 Funkog Sweden。我们刚刚度过了一个短暂的暑假回来了,因为这里是瑞典。我们通常在七月休假,所以整个七月我们都没有直播。因此,欢迎来到 Funkro Sweden。 Funkro Sweden 是什么?我们是一个 meetup,也是一个 YouTube 频道,我们探索并致力于函数式编程。我们也欢迎函数式编程的新手、单纯好奇想了解更多的人,以及函数式编程的老手。所以热烈欢迎各位。 那么,让我们进入今天的议程。首先,正如你们注意到的,我会做一个简短的开场介绍。然后我们将进入第一个演讲:Richard Feldman 带来的 Rock 0.10 预览。我相信那会是一个非常非常有趣的演讲。Richard 之前来过我们这里,我想大概是两年前,当时他介绍了 Rock。现在他回来预览 0.10(0.1.0)版本。之后我们会进入 Michael Borquent 对 Regami 的介绍,那也非常有趣。他会讲到为什么要构建一个 Web 框架等等。不过,首先我要感谢今天的视频赞助商 Autobe。如果你想了解更多关于 Autobe 的信息,可以在社交媒体上或他们的网站 web page.com 上查看,那里有更多信息和联系方式。 好的,让我们看看接下来的安排。九月我们会回来,但九月的日期还没有确定。我们会带着日期回来,希望还有两位演讲者和两个有趣的演讲。然后是十月的 Funk ProConf,今年将是一整天的会议。去年我们也办了一次 Funk ProConf,当时是半天,三个演讲。今年将是一整天的演讲,场地更大,人也更多。去年,我得强调一下,我们的票卖光了。所以一定要去 Funko Conf 看看,确保及时买到票。就像去年我说过的,不是所有想来的人都能来。是的。然后十一月我们回来,我们再次在 Kra 进行直播。所以那将是一个混合活动,既有现场也有直播。然后十二月,我们会有另一个 meetup。另外,如果你想支持 Funkro Sweden,最简单的方式就是去加入 meetup 小组,并确保订阅 YouTube 频道。这是支持我们最简单也是最好的方式。还有,如果你想和更多人交流、想了解更多、想向演讲者提出更详细的问题,那就加入 Discord 频道,你可以在那里问更多问题。现在是这样。如果你有问题,可以在 YouTube 聊天中发出来。不过,我觉得 YouTube 可能不允许太长的句子。所以还是去 Discord 提问吧。好了,我们即将开始今晚的第一位演讲者和第一个演讲。或者取决于你在哪里,可能今天是白天。所以,热烈欢迎 Richard 来到 Funkro Sweden,欢迎回来。 嘿,你好。 哦,你需要解除静音。是的。或者他需要解除静音。是的,别担心。我们能解决的。 >> 现在可以了。 >> 好的,现在能听到你说话了。 >> 是的,现在我们听到你了。我们这边需要解除静音。抱歉。[笑声] >> 你被静音了。不,是我被静音了。谁被静音了? >> 别担心。 >> 谢谢。是的,热烈欢迎 Richard。舞台交给你。 >> 太好了,非常感谢。嗯,是的,这个演讲是关于 Rock 编程语言的。如果你不熟悉 Rock,别担心。我不会对整个语言做完整教程。我主要会讲一个概述,比如我们在做什么、我们处于什么阶段、我们目前构建了什么。到演讲结束时,你应该会大致了解为什么 Rock 可能很有趣,以及为什么你会对即将到来的 0.1.0 版本感到兴奋,这将是我们第一个有编号的版本发布。既然这是一个 meetup,而不是会议演讲,如果你中途想提问,我完全乐意停下来回答问题。而且,我们也可以跑题之类的。我会尽量自己留意时间,不让他[笑声]拖得太久。呃,如果我们在跑题上花太多时间也没关系,我很乐意跑题。我们不需要严格遵循这里的演讲内容。好的,那么让我们从一些基础幻灯片开始,我会做一个小演示。Rock 编程语言——0.1.0 版本预览。我是 Richard Feldman。Rock 的口号一直是“快速、友好、函数式”。这是我们对这门语言的三个价值观。快速,是指我们真的希望这门语言编译快,同时运行也快,运行时快。友好,是指用户友好,同时也希望有一个友好的社区。这既是一个社区价值观,也是用户友好的错误消息、开箱即用的良好工具等等。当然还有函数式,因为它是一门函数式编程语言,不是多范式,不试图做面向对象或任何其他东西,只是函数式。好的,那让我们在深入其他内容之前先做个演示,这样你能大致看到现在可以用 Rock 做些什么。这是一个大约 2000 行代码的 Rock 示例,这将是一个 GUI 应用。我来运行一下。它叫 Screwbot,实际上不是我做的,是 Luke Boswell 做的。让我全屏显示。基本上这是一个小机器人手臂,你可以摆动它。你可以看到所有这些不同的滑块之类的东西,你可以这样移动它们。嗯,我不太确定 Luke 做这个东西的目标是什么,或者它应该做什么。我主要只知道怎么点击按钮[笑声]和拖动小机器人手臂。所以,呃,Luke 在澳大利亚,所以现在他那边大概凌晨两三点。所以他来不了,但如果你想问他问题,他在 Rock Zulip 上,用户名是 Luke Boswell。嗯,总之,就像我说的,这大约是 2000 行 Rock 代码。Rock 中一个很酷的地方是你可以做热代码加载。比如说,我不知道,PGA Lab。在哪儿?呃,PGA motor,PGA live,PGA Lab。找到了。好。我们就在这里加一些感叹号。接下来会发生的是,如果你看这里,这些感叹号应该马上出现在那里。嗯,是的,出现了。这是在热代码加载发生的时候。也就是说,我当前的所有状态,比如机器人手臂等等,都被保留了。你可以回去把它们去掉。这就像,你知道,热代码重载检测到了,然后又把它们去掉了。所以,嗯,是的,你可以动态地修改程序,然后它就会热代码加载。这仅仅是我修改源代码,然后我将退出。这只不过是我在那个 main.rock 程序上运行 Rock。这并不是说,你知道,我设置了一个独立的、复杂的第三方 watch 构建工具。这些都是开箱即用的。嗯,我希望让这个构建更快。对于 0.1.0 来说,这也许可以接受,但你知道,启动确实花了几秒钟,检测热代码也花了几秒钟。理想情况下,我们可以在所有情况下都让这个时间接近亚秒级。嗯,但显然,这不是这门语言的最终版本。当然,它是 0.1.0,不是 1.0,但同时也并非另一个极端,比如需要非常长时间,或者你必须重启整个程序。嗯,好的。那么,让我们简单谈谈 Rock 的语法之类的东西,这样你可以更深入地理解这门语言。 所以,这里有一个非常基本的 Rock 函数调用。这是 `file.readUTF8`。感叹号是名称的一部分,我待会儿会讲,这是 Rock 中一个重要的命名约定。然后你有一个参数,即路径。嗯,`readUTF8` 这部分基本上就是函数本身。这就是普通函数调用的工作方式。而 `file` 部分基本上是在说这个函数住在哪里。我们有一个叫做 `File` 的类型。在 Rock 中,类型总是大写。`file.` 你可以把它想象成一种静态方法,或者如果你熟悉 ML 家族的语言,比如 Haskell 或 Elm,你也可以把它想象成一个模块,但它与一个叫做 `File` 的类型相关联。嗯,这是该函数的完整类型。`readUTF8` 有这样一个类型。这里的这个,你可以理解为我们表达“函数 `readUTF8` 的类型是……”的语法。冒号表示“具有类型”。如果你熟悉 Haskell,这会是双冒号;如果你熟悉 Elm,会是单冒号。嗯,然后我们说,这是该函数接收的一个参数。如果它接收多个参数,它们会用逗号分隔。Rock 不做柯里化,或者说,Rock 函数默认不是柯里化的。Rock 中有两种箭头:粗箭头和细箭头。这是一个粗箭头,也就是 `=>`。这基本上意味着这是一个“effectful”(有副作用)函数。换句话说,这是一个在运行时不保证是纯函数的函数,它被允许执行副作用。我们也有纯函数,它们没有这个粗箭头,而是细箭头,比如 `->`。实际上,纯函数是更常见的例子。但我在这个语法示例中要重点讲 effectful 函数,仅仅是因为 IO 是很多人在面对拥有一等纯度概念(Rock 确实如此)的语言时的一个大问题。嗯,这是函数的返回值。这是[清嗓子]一个叫做 `Try` 的类型,它有两个类型参数:第一个是 `String`,即字符串;另一个类型参数是方括号里的这个东西。简单说,Rock 中的 `Try` 基本上类似于 Elm 或 Rust 中的 `Result`,或者 Haskell 称它为 `Either`。它基本上是一个有两个不同类型参数的类型,一个用于成功类型,一个用于错误类型。成功类型基本上是:`readUTF8` 函数接收一个路径,然后假设该路径后面的文件包含一堆 UTF-8 格式的文本;如果我们成功读取了整个文件,就会得到这个字符串;如果读取失败,你就会得到其中一个东西。这里的方括号内是匿名和类型。Rock 有和类型,类似于代数数据类型,就像你知道的 Elm、Haskell 或 Rust 那样,这些在不同语言里有不同叫法,比如可辨识联合。让 Rock 与大多数这些语言不同的一个特点是,它拥有匿名或结构化的和类型。你不需要事先正式定义它们,你基本上可以说:嘿,这是某个匿名变体,我们称之为标签联合。其中变体的名称或标签是 `FileRead`,然后它有一个载荷,即 `FileReadError`。这基本上意味着,如果你在积累不同的错误场景(我们一会儿会看到),这个特定的函数,比如我调用 `readUTF8`,就会向那个错误联合中贡献一个这样的变体。换句话说,如果我执行了一次文件读取,那么之后可能发生文件读取错误;如果紧接着我执行文件写入,你可以想象,如果我们有一个 `file.writeUTF8`,它可能会贡献一个文件写入错误。这样我现在就有两种错误要处理,可能是读取错误或写入错误,因为自然情况下,如果我进行读取然后写入等等,这些操作可能以不同方式出错。如果我做网络请求,这里可能会有网络错误。嗯,但这是一个完全普通的和类型,是代数数据类型,你可以对它做模式匹配,所有这些正常操作。Rock 没有异常的概念。它也没有像 Go 那样的概念,我们稍后会看到,比如 `if err != nil`。它没有 `null`,没有 `undefined`,只有代数数据类型。而且,我想说,正是这种匿名代数数据类型让我们的错误处理异常顺手。我们一会儿会看到一个例子。 那么,如果我想给这个结果赋一个值,因为这只是又一个返回普通值的普通函数,比如 `url = ...`,这将是一个常量。Rock 没有像 `const` 或 `let` 这样的关键字。因为在 Rock 中,这基本上是你做的普通默认事情:你说,我只想创建一个名为 `url` 的常量。就是这样,砰,这就是你定义常量的方式。嗯,Rock 不允许遮蔽,而且当然这些是常量,不能被重新赋值。这意味着如果我在外层作用域写了 `url`,那会给我一个错误,因为它说:哦,你不能遮蔽这个,你在外层作用域已经定义了一个。还有,如果我之后在下面写 `url = ...`,它会说,要么如果它在同一作用域里,你不能重新定义它,你已经把它定义为某个值,而且它是一个常量;或者如果它在一个嵌套作用域中,它会给你一个不同的遮蔽错误。我知道有些语言非常重视常量和不可变性,Rock 当然也是。比如 Elixir 或 Rust,它们允许你重新声明,比如回收同一个名字,但它有一个完全不同的定义。嗯,Rock 不会这么做。

相似文章

Mojo v1.0.0b1

Lobsters Hottest

Mojo,Modular 推出的高性能编程语言,已发布 1.0.0 beta 1 版本。

面向程序员的逻辑学 v0.15,现场编程

Hillel Wayne — Computer Things

Hillel Wayne 宣布其著作《Logic for Programmers》的 0.15 候选版本,并重点介绍了一场以 Strudel 和 CLAVIER-36 为特色的现场编程聚会,用于音乐编程。

Mojo 1.0

Hacker News Top

Modular announces the 1.0 release of the Mojo programming language, offering a stable foundation for developers building libraries, tools, and applications with enhanced features like Python-style lambdas, improved LSP, and memory safety diagnostics.