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 语言编写的,其生命周期大致如下:
- jvm 加载 Clojure 运行时、准备就绪以及其他一些东西。
- 宏已编译
- 宏运行并生成新的 ClojureScript 表达式
- 如果该表达式又是一个宏循环。
这省略了 ClojureScript 编译器其余部分(大部分)完成的所有部分,因此我们可以专注于 ClojureScript 宏只能访问 JVM 可用的 Clojure 部分这一事实,并且not node while they are 运行 由该宏编辑的表单 return 将成为已完成的 ClojureScript 程序的一部分,可以访问节点 API,例如 readFileSync。
简而言之,您的宏应该 return 调用 readFileSync 而不是在宏处于 运行 时读取文件。如果您的代码在评估宏时确实需要读取一些文件,因为例如它们包含要输出的代码或其他内容,那么您将需要使用 Clojure 表单来读取这些文件,例如对 slurp
的调用有以上。
我正在用 lumo 编写一个 cli 脚本,我想要下面的宏,但是使用来自 nodejs 的 readFileSync
。
(defmacro compile-time-slurp [path]
;; slurp is not defined in self hosted cljs
(slurp path))
这可能吗?
编辑:更清楚地说,这是在自托管的 clojurescript 中,其中 slurp
函数在宏扩展时不可用。
ClojureScript 宏是用 Clojure 语言编写的,其生命周期大致如下:
- jvm 加载 Clojure 运行时、准备就绪以及其他一些东西。
- 宏已编译
- 宏运行并生成新的 ClojureScript 表达式
- 如果该表达式又是一个宏循环。
这省略了 ClojureScript 编译器其余部分(大部分)完成的所有部分,因此我们可以专注于 ClojureScript 宏只能访问 JVM 可用的 Clojure 部分这一事实,并且not node while they are 运行 由该宏编辑的表单 return 将成为已完成的 ClojureScript 程序的一部分,可以访问节点 API,例如 readFileSync。
简而言之,您的宏应该 return 调用 readFileSync 而不是在宏处于 运行 时读取文件。如果您的代码在评估宏时确实需要读取一些文件,因为例如它们包含要输出的代码或其他内容,那么您将需要使用 Clojure 表单来读取这些文件,例如对 slurp
的调用有以上。