17611538698
webmaster@21cto.com

新的编程语言 Fennel:LUA中的LISP

编程语言 0 622 2024-09-09 06:46:24

导读:向大家介绍一种新的有味道的编程语言,Fennel。

图片

我们本月的语言是 Fennel — 直接翻译过来叫法是茴香。

但这里介绍不是甘草味的小蔬菜,而是一种有趣的小语言,它建立在 Lua 之上,在社群中还有一帮人专门使用 Lua。正如我们将在本文末尾看到的那样,你可以在 TIC-80 中使用 Fennel 来制作游戏和生成艺术作品。

Fennel 是一种 Lisp,所有 Lisp 都具有与语言非常相似的形状:它们围绕 s 表达式(用括号括起来的符号列表)构建,并使用所谓的前缀或“波兰表示法”语法。

因此,在包括 Fennel 在内的所有 Lisp 中,你不能写成 2 + 2,而是要说 (+ 2 2)。

好吧,为什么这么写?这是 50 年代设计第一个 Lisp 时的原始答案。由于其结构简单,制作一种易于实现的语法似乎是合理的。但我们已经离那时近 70 年了,那么为什么现在要使用 s 表达式和括号呢?部分原因是因为它使代码编写变得简单。不需要记住太多东西,而且你可以很容易地在 Lisp 语言之间切换。

另一个相当重要的原因是,常规结构允许您编写宏,即使用语言编写代码,接收 S 表达式并将其转换为其他 S 表达式。它们就像函数,只不过它们实际上会更改您编写的代码。

我们不会在本文中真正讨论宏,但当我们在未来的 TIC-80 项目中使用 Fennel 时,我们可能会展示一些有趣的宏示例。现在,我要说的是,宏可以让你创建一种语言的新功能,这些功能是你希望它拥有的。这是一种无需创建全新语言即可破解编程语言本身的方法。

图片

话虽如此,我认为介绍该语言的最好方式是向您提供本月 TIC-80 文章中该程序的 Fennel 版本。

Fennel的一些特性,我们总如下:

  • 完全兼容 Lua:轻松从 Fennel 调用任何 Lua 函数或库,反之亦然。

  • 零开销:编译后的代码应该与手写Lua一样高效。

  • 编译时宏:发送编译后的代码,而不需要对 Fennel 进行运行时依赖。

  • 可嵌入:Fennel 是一个单文件库,也是一个可执行文件。可将其嵌入到其他程序中,以支持运行时可扩展性和交互式开发。


;; Sample: read the state of the keyboard and move the player accordingly(local dirs {:up [0 -1] :down [0 1] :left [-1 0] :right [1 0]})
(each [key [dx dy] (pairs dirs)] (when (love.keyboard.isDown key) (let [[px py] player x (+ px (* dx player.speed dt)) y (+ py (* dy player.speed dt))] (world:move player x y))))

嗯,任何可以运行 Lua 代码的地方都可以运行 Fennel 代码。

哎呀,工作量太大了!


好的,莫要慌张,其实你可以随时使用 Fennel,而无需安装任何东西:


图片

运行地址:https://fennel-lang.org/see

你可以看到,我们故意使用Python语法写了一段,它返回了错误信息。而第二段的Fennel语法,可以是正常的运行。

开发社区


Fennel 的存储库位于 Sourcehut 上,讨论在 邮件列表和Libera.Chat 和 Matrix 上的 #fennel 频道上进行。 对于喜欢它的人来说,GitHub 上的一个存储库是个只读镜像。


Fennel 茴香编程语言:https://fennel-lang.org/

茴香编程语言的GitHub:https://github.com/bakpakin/Fennel

作者:聆听音乐的鱼

评论