ClojureScript 代码里不能像 Clojure 那样直接编写 Macro. 即便引用 Macro, 在 ns
定义当中也要用 :require-macros
代替 :require
才能正确引入. 所以在 ClojureScript 当中引入 Macro 是需要写在单独的文件当中才行的, 比如 .cljc
或者 .clj
文件当中, 再从 .cljs
文件里引用.
那么 REPL 当中怎样引用呢, self-hosted ClojureScript 提供了一个方案. self-hosted ClojureScript 是运行在 js 上的 ClojureScript 编译器, 特别用在了 Lumo 和 Planck 的实现当中.
在 self-hosted cljs 当中涉及了一个特殊的命名空间的后缀来解决 Macro 的问题, 比如定义这样的命名空间:
(ns foo.core$macros)
然后正常地定义 Macro:
(defmacro hello
[x]
(prn &form)
`(inc ~x))
随后用去掉后缀的命名空间调用, 这个 Macro 就可以生效了.
(foo.core/hello (+ 2 3))
这个写法很适合随时修改代码探索使用. 一般写配置启动文件结构会略复杂. 具体细节参考 http://blog.fikesfarm.com/posts/2015-09-07-messing-with-macros-at-the-repl.html
基于 JVM 的 REPL 当中使用 Macro 的方案并不清楚. 对于 shadow-cljs 目前了解到主要还是 shadow-cljs.edn
配置项目之后运行代码. shadow-cljs 有个一个 node-repl
, 但是并不清楚.
后续还需要官方进一步梳理指导才行…