Clojure China

在 ClojureScript 的 REPL 里写 Macro

#1

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, 但是并不清楚.

后续还需要官方进一步梳理指导才行…

我在 ClojureScript 的 2017