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

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