导读:向大家介绍一种新的有味道的编程语言,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 代码。
运行地址:https://fennel-lang.org/see
你可以看到,我们故意使用Python语法写了一段,它返回了错误信息。而第二段的Fennel语法,可以是正常的运行。
茴香编程语言的GitHub:https://github.com/bakpakin/Fennel
作者:聆听音乐的鱼
本文为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。