返回资讯中心
外部精选
软件工程
#开发者实时流

Quill 编程语言亮相:强调意图清晰、失败显式与精确金额

来源标题:Quill – a readable language where money is exact and failures can't hide

Quill 是一门仍处早期开发阶段的编程语言,设计目标是让意图清晰、失败显式,并把正确性写进代码。目前其解释器已实现 say、变量、精确算术、money(如 100 USD)、maybe、fails/on/try、契约(require、ensure)等首批特性,但尚不适合生产环境。它面向后端、金融软件、自动化、商业应用及 AI/ML,并计划支持在许可机制下调用 Web 服务和 AI 模型。

Hacker News 最新NgwangShalom2026/11/3 · 今天29 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

写出你的本意。 意图清晰,失败明确,正确性本身就是代码的一部分。

⚠️ Quill 仍处于早期开发阶段。设计正在逐步写成文档,解释器目前已经能运行第一批特性:say、值、var / set、精确算术、文本中的 {值}、when、for 循环、get 和 sum、列表、记录、check 与文档示例、函数(fn、return)、货币(100 USD)、maybe、失败(fails、on、try),以及契约(require、ensure、where)。目前这些内容都还不能用于生产环境。如果你在意一门语言应该给人什么样的感觉,现在正是参与塑造它的最佳时机。

Quill 是一门编程语言,意图清晰,失败明确,正确性是代码的一部分。它面向后端工程、金融软件、自动化、可靠的企业应用,以及 AI 和机器学习。初学者也应该能读懂它。当程序向模型提问时,同样的谨慎同样适用:答案可能缺失,调用也可能失败。

语法保持人类可读。when、found、missing、fails、on 和 check 是赋予 Quill 独特声音的词语。

Quill 可以调用 Web 服务、向 AI 模型提问,每一项都在许可之后进行。Web 服务器和数据库是接下来的目标。那是通往可部署服务的路径。

这些想法单独来看都不新鲜。Quill 的目标是让它们协同工作,汇聚在一门人可读、团队可信的语言里。

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Ngwangshalom/Quill/releases/latest/download/quill-installer.sh | sh

Windows(PowerShell): powershell -ExecutionPolicy Bypass -c "irm https://github.com/Ngwangshalom/Quill/releases/latest/download/quill-installer.ps1 | iex"

或者从 Releases 页面下载适合你系统的构建版本。然后试一试: quill new hello quill run hello/hello.quill

quill new 会询问你想要哪种程序,每个模板都能直接运行并通过测试。直接指定名称可以跳过菜单,比如 quill new orders backend:

每个项目都附带一个 README.md 和一个 QUILL.md,后者是一页纸的语言导览。

以后要更新,运行 quill update,用方向键选择版本。Quill 还会在新版本发布时通知你(设置 QUILL_NO_UPDATE_CHECK=1 可关闭该提示)。

从源码构建需要 Rust:cargo install --git https://github.com/Ngwangshalom/Quill

《The Quill Programming Language》是一本从零开始教 Quill 的书,面向新手和有经验的程序员。它随语言一同成长,书中的每个示例都经过测试。其源码位于 book/src。

第一次运行 Quill 时,Cursor 和 VS Code 会获得 Quill 专属配色、每个 .quill 文件上的羽毛图标,以及错误的下划线提示。羽毛在深色编辑器上呈浅色,在浅色编辑器上呈深蓝色。每一类词都有自己的颜色:say 是笔尖橙 #F0A35E,when 是羽毛蓝 #7EAEF5,true 是绿色 #5ECA8C。Vim、Emacs 和 Sublime 会从 editors 目录中识别 .quill 文件。quill lsp 可以把同样的错误提示发送到任何编辑器。设置 QUILL_NO_EDITOR_SETUP=1 可让 Cursor 和 VS Code 保持原样。

Hello, World say "Hello, World!"

值与变更 = 用于声明一个值。除非标记为 var,否则值不能改变,而改变值需要使用 set,因此每一处变更在阅读代码时都清晰可见。 name = "Amina" var visits = 0 set visits = visits + 1 set name = "Omar" -- 错误:name 未标记为 var set vistis = 2 -- 错误:没有名为 vistis 的值(你是指 visits 吗?)

包含引号的文本用三个引号包裹,这样内部的引号无需反斜杠转义: quoted = """She said "hi"."""

处理文本 typed = " amina@school.org " email = lowercase trim typed when email contains "@" and email ends with ".org" -> say "A school address" else -> say "Check the address" parts = split "Amina,80,paid" by "," say join parts with " / " say replace "-" with " " in "INV-2026-001"

这段代码会输出 A school address、Amina / 80 / paid 和 INV 2026 001。length of email 为 16。

fn double(n: number) -> number return n * 2 say double(21)

fn greet(name: text) say "Hello, {name}" greet("Amina")

参数的 kind 可以是 text、number、true/false,或由其中一种组成的 list。诸如 Int 和 Text 这样的 kind 名称将在后续加入。

when 遵循一条简单规则:对固定的一组情况(如 maybe 或 failures)进行匹配时,必须覆盖所有情况;对数字或文本进行匹配时,必须以 else 结尾。

fn find_price(name: text) -> maybe number when name == "bread" -> return found 2.50 else -> return missing

when find_price("bread") found price -> say price missing -> say "none"

如果漏掉 missing 分支,Quill 会拒绝运行。诸如 User 这样的命名类型将在后续加入。

fn charge(amount: USD) -> text fails Declined, NetworkDown

var receipt = charge(250 USD) on Declined -> say "Card declined" on NetworkDown -> say "Try again"

在声明了相同失败的函数内部,try 会将这些失败显式向上传递:

fn checkout(amount: USD) -> text fails Declined, NetworkDown return try charge(amount)

on 后面的语句(比如 say)会执行,然后终止程序。而用一个值代替调用的结果时,程序会继续运行:

var receipt = charge(250 USD) on Declined -> "declined" on NetworkDown -> "try again"

respond 将随 Web 模块一同到来。

label = when score >= 70 -> "A" score >= 50 -> "Pass" else -> "Fail"

第一个为真的分支给出值。else 是必需的,因此总有一个分支会命中。

total = 100 USD + 50 USD

结果是 150 USD。100 USD + 20 EUR 是错误的:Quill 不会混合货币。split、round、20% of fee 以及 convert ... at RATE 都能让金额保持精确,不隐藏一分钱。货币本身就是 kind:amount: USD。amount: USD where 1 USD..10000 USD 还能为其指定范围。

sum 用于汇总一个字段。get 取出该字段,包括更深层的字段。where 只保留匹配的记录。count of 给出数量,average 给出典型金额,sorted by 将记录排序。缺失的金额会被略过。当每条记录都需要单独一步时,使用 for。

sisters = record name = "Nchang Sisters", fee = 80000 USD brass = record name = "Bamenda Brass", fee = 150000 USD

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →