返回

文章详情

为什么选择Janet?

Hacker News2026年6月2日 09:34

我从未想过这种事情会发生在我身上。我是说,括号?在这个时代?但是在过去的几年里,我的休闲副项目的主要编程语言是一种叫做Janet的小Lisp方言。(print "hey janet") 我对Janet如此喜爱,以至于我写了一整本书,放在互联网上供大家免费阅读,以期吸引更多的Janet用户。我认为你应该读它,但我知道你不相信我,所以我会尝试说服你。以下是我尝试的销售推介:这是为什么你——尤其是你——应该给Janet一个机会的理由。Janet是简单的Janet是一种命令式语言,具有一流的函数、标识符的单一命名空间和词法块作用域。语言的核心非常小,仅由八条指令组成:do、def、var、set、if、while、break、fn。由于宏的存在,有很多高级封装可以为你提供更强大或方便的控制流。你可以在一个下午“学习”Janet,因为其运行时语义非常熟悉:想想JavaScript,加上值类型,减去所有的奇怪之处。语言的其余部分也很小:整个标准库可以放在一页上。正是这种简单入门的优势让我一开始就被吸引了。Janet是可分发的将Janet程序编译为静态链接Janet运行时的本地可执行文件非常简单。你可以与其他人共享这些程序,而无需让他们先安装Janet——或你项目的依赖项,或其他任何东西。你甚至不必告诉他们这是用Janet写的!Janet实现这一点的方式非常优雅:Janet将自己编译为字节码,然后将该字节码写入一个.c文件,该文件还启动Janet运行时。然后,它使用你的系统C编译器编译该C文件。由于Janet被设计为易于嵌入,这很合理:它本质上是将自身嵌入到一个微不足道的C可执行文件中。一个简单的Janet“你好,世界”编译为本地二进制文件的大小不到一兆(784K,适用于aarch64 macOS的Janet 1.27.0,但你的情况可能会有所不同)。这包含完整的Janet运行时、垃圾收集器,甚至字节码编译器——所以如果你愿意,可以编写在运行时评估Janet代码的程序。这使Janet成为编写小型命令行应用程序的绝佳选择。尤其是当你考虑到...Janet在解析文本方面表现得异常出色Janet的文本处理不是基于正则表达式,而是基于解析表达式文法。解析表达式文法比正则表达式更简单、更强大、也更可预测。它们不是面向行的,因此可以毫无问题地解析多行文本。它们还可以解析HTML、JSON或任何其他非正则语言。它们也能解析二进制文件格式——对于任意的空字节,它们没有问题。它们确实是解析器:结构化的、可组合的、一流的解析器。而且它们相对容易学习!Janet有着任何高级语言中最好的子进程DSL有一个名为sh的第三方库,提供了一个壳脚本DSL,允许你在Janet中直接表达管道和重定向。像这样:($ find . -name *.janet | say) 这真是不可思议。这是一个如此优秀的DSL,以至于我在《普通人的Janet》中为它专门写了整整一章——以及你可以用它做的事情。它将Janet从一个合理的Perl替代品提升到了一个合理的Bash替代品,适用于意想不到的大范围程序。Janet是可嵌入的Lua已成为事实上的“嵌入语言”,这很遗憾,因为...嗯,这不是一篇关于Lua的文章。你可能对此不太在乎,但有可能只是因为你还没有尝试过:能够编写暴露脚本接口的程序是一种相当有趣的超能力。嵌入Janet非常简单:Janet运行时是一个小型C库,所有你需要做的就是将其链接进来,然后调用常规C函数以操作Janet值。你甚至可以将它嵌入到网站中,编写具有自定义可编程DSL的静态网站!Janet有可变和不可变集合Janet的集合类型有可变和不可变的选项。不可变集合具有值语义:不可变向量[1 2]与(take 2 [1 2 3])是不可区分的,尽管它们有不同的内存地址。另一方面,可变集合具有引用语义:哈希表@{:x 1 :y 2}仅等于自身。另一个具有相同键和值的哈希表是一个不同的对象。并不是每种语言都将不可变复合值直接构建在标准库中!宏,宏,宏我认为这才是你应该学习Janet的真正原因,但我不想开头就提到它,因为我不想吓到你。你可以毫无问题地编写Janet,而无需了解如何编写宏。但是你应该了解如何编写宏,因为编写宏是有趣的。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡