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

时间:2017-07-06 22:05:08

标签: clojure clojurescript

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

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

这可能吗?

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

1 个答案:

答案 0 :(得分:4)

ClojureScript宏是用Clojure语言编写的,大概有这个生命周期:

  1. jvm加载Clojure运行时,准备就绪以及其他一些东西。
  2. 宏编译
  3. 宏运行并生成新的ClojureScript表达式
  4. 如果该表达式再次是一个宏循环。
  5. 这省略了在ClojureScript编译器的其余部分(大部分)中完成的所有部分,因此我们可以专注于ClojureScript宏只能访问可从JVM而非节点获得的Clojure部分的事实在运行时,该宏返回的表单将成为已完成的ClojureScript程序的一部分,可以访问节点API,例如readFileSync。

    简而言之,您的宏应该返回对readFileSync的调用,而不是在宏运行时执行文件读取。如果您的代码在评估宏时确实需要读取一些文件,因为例如它们包含要输出的代码或其他东西,那么您需要使用Clojure表单来读取这些文件,例如调用/super-shiny-cars/volvo-x90你以上。