提醒一下,这可能是一项艰巨的任务,但可能是一项很棒的学习练习。
如果您想从 Clojure 获得相同的控制,您将不得不重新实现 Sweet.js 中的概念或宏,或者来自 Babylon(Babel 的解析器)的自定义解析器扩展的想法。
无论哪种方式,您都需要编写一个能够理解 JavaScript 语法超集的解析器。您可能想查看解析器生成器,例如instaparse (Clojure)和peg.js (JavaScript)。
然后您需要决定是要对语言语法进行固定数量的添加(如 Babel)还是允许宏定义自己的语法扩展/替换规则(如 Sweet.js)。此时,您需要编写某种引擎来转换解析器生成的 AST。
宏可以通过多种方式实现,从C 和 C++ 中的替换规则到Clojure 中直接与 AST 一起工作的完整编译时评估函数。
使用这个新工具解析和转换 AST 后,您需要将其转换为有效的 JavaScript AST。这将使维护与ESTree 规范的兼容性变得更容易,因为这将允许您使用escodegen等工具从 AST 本身实际生成 JavaScript 代码。
当然,只有当您将工具编写为 ClojureScript 并针对 NodeJS 编译和运行它时,才能使用像 peg.js 和 escodegen 这样的工具。另一种选择是在 JVM 生态系统中找到兼容的工具,并将它们与 JVM 编译的 Clojure 一起使用。
JavaScript 生态系统有一系列很好的工具可用于解析、转换和生成 ES 代码(查看 Babel 包,例如/灵感),但你必须记住,如果你正在编写 ClojureScript 并在 Node 下运行它,实际上,您正在创建一个 JavaScript 可执行文件,并且从一开始就使用 JavaScript 可能会更容易一些。