Clojurescript 宏:在编译时使用节点 api

Clojurescript macros: Using the node api at compile time

我正在用 lumo 编写一个 cli 脚本,我想要下面的宏,但是使用来自 nodejs 的 readFileSync

(defmacro compile-time-slurp [path]
  ;; slurp is not defined in self hosted cljs
  (slurp path))

这可能吗?

编辑:更清楚地说,这是在自托管的 clojurescript 中,其中 slurp 函数在宏扩展时不可用。

ClojureScript 宏是用 Clojure 语言编写的,其生命周期大致如下:

  1. jvm 加载 Clojure 运行时、准备就绪以及其他一些东西。
  2. 宏已编译
  3. 宏运行并生成新的 ClojureScript 表达式
  4. 如果该表达式又是一个宏循环。

这省略了 ClojureScript 编译器其余部分(大部分)完成的所有部分,因此我们可以专注于 ClojureScript 宏只能访问 JVM 可用的 Clojure 部分这一事实,并且not node while they are 运行 由该宏编辑的表单 return 将成为已完成的 ClojureScript 程序的一部分,可以访问节点 API,例如 readFileSync。

简而言之,您的宏应该 return 调用 readFileSync 而不是在宏处于 运行 时读取文件。如果您的代码在评估宏时确实需要读取一些文件,因为例如它们包含要输出的代码或其他内容,那么您将需要使用 Clojure 表单来读取这些文件,例如对 slurp 的调用有以上。