2017-07-06 21 views
3

我正在用lumo写一个cli脚本,我想要下面的宏,但是使用nodejs中的readFileSyncClojurescript宏:在编译时使用节点api

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

这可能吗?

编辑:更清楚的是,这是在自承载的clojurescript,其中slurp函数不可用于宏扩展时。

回答

4

ClojureScript宏都写在Clojure的语言,大致有这样的生命周期:

  1. JVM装载Clojure的运行时间,准备好和一堆其他的东西。
  2. 宏被编译
  3. 宏运行并产生一个新的ClojureScript表达
  4. 如果该表达式是再次宏循环。

这省去在ClojureScript编译器(这是大部分)的其余部分完成的所有部分,所以我们可以专注于一个事实,即ClojureScript宏只能访问的Clojure的是可从JVM零件而不是节点运行时该宏返回的表单将成为完成的ClojureScript程序的一部分,可以访问节点API,例如readFileSync。

总之,您的宏应该返回一个调用readFileSync,而不是在宏运行时读取文件。如果您的代码在评估宏时确实需要读取某些文件,例如它们包含要输出的代码或某些内容,则需要使用Clojure表单来读取这些文件,例如您上面调用slurp

+0

再次感谢amalloy修复我的speelng和gramarrrr :-) –

+0

也许问题不是很清楚,但我使用的是自我托管的lumo。并且在自托管中,'slurp'函数在编译时不起作用。 – madstap

+1

目前还不清楚如何使这些工作受到这些限制,抱歉: - /我希望有一些方法可以避免在这里使用宏并避免这个问题。这些东西通常是由于“宏观蔓延”而产生的,可能是一种痛苦。 –