Fennel 单文件库的挑战与解决方案

2025-08-13
Fennel 单文件库的挑战与解决方案

本文探讨了在 Fennel (一种基于 Lua 的 Lisp 方言) 中构建单文件库的挑战,尤其是在处理宏和函数同时存在的情况下的复杂性。作者详细分析了 Lua 的模块系统,包括 package.loaded、package.preload 和 package.searchers 的工作机制,并解释了 Fennel 如何利用这些机制来编译和加载模块。文章的核心在于解决 Fennel 宏的局限性,例如无法直接导出宏以及宏之间相互依赖的问题。作者提出了一种巧妙的方案,利用 `eval-compiler` 和 `relative-require` 技术,将宏和函数打包到同一个文件中,并通过在编译时手动设置 `fennel.macro-loaded` 表来解决宏加载问题。最后,作者还展望了 Fennel 宏系统未来的改进方向,建议取消宏模块,直接在编译时加载整个模块,并借鉴 Clojure 的处理方式来解决宏依赖问题。

阅读更多
开发

Fennel 中动态作用域的巧妙实现

2025-07-27
Fennel 中动态作用域的巧妙实现

作者在 Fennel (一种 Lua 方言) 中实现动态作用域,这在 Lua 本身并不直接支持。文章详细探讨了多种方法,包括利用 Lua 的 debug 库操作函数环境,以及巧妙地克隆函数并设置其环境。虽然最终作者决定暂不将此功能集成到 fennel-cljlib 库中,但文中对 Lua 函数环境和动态作用域的深入探讨,以及不同实现方案的比较,对理解函数式编程和元编程具有重要参考价值。

阅读更多

在Emacs中运行Fennel:一个强大的扩展

2025-07-23
在Emacs中运行Fennel:一个强大的扩展

本文介绍了一个名为`require-fennel.el`的Emacs扩展,它允许用户在Emacs中运行Fennel(一种Lua方言)。该扩展通过与Fennel REPL进行通信来实现此功能,允许在Emacs Lisp和Fennel之间进行数据转换和函数调用。作者展示了如何加载Fennel模块、调用Fennel函数、以及在Emacs Lisp中使用Fennel数据结构。此外,该扩展还支持从Fennel调用Emacs Lisp函数,实现了双向交互。这使得开发者能够利用Fennel的简洁性和Emacs的强大功能,创造更强大的Emacs环境。

阅读更多
开发 Fennel