Clojurescript - 如何在 REPL 中 use/import 宏 (figwheel)

Clojurescript - how to use/import macros in REPL (figwheel)

我似乎无法在 clojurescript REPL 中使用宏。

我在macros.clj中定义宏:

(ns clojurescripting.macros)

(defmacro increment [x]
  `(+ 1 ~x))

然后我在core.cljs

中使用它
(ns ^:figwheel-hooks clojurescripting.core
    (:require-macros [clojurescripting.macros]))

(defn main []
      (js/alert (clojurescripting.macros/increment 0)))

(main)

该代码实际上使用了 increment 宏,因为它给出了正确输出的警报。

我 运行 回复 clojure -A:fig:build

当我尝试在 REPL 中使用宏时,我无法访问宏 - 没有 clojurescripting.core/increment,我也无法访问 clojurescripting.macros

另一个问题: 这在任何 REPL 中都可能吗?总的来说这似乎是可能的,因为书 Learning Clojurescript 提供了几乎相同的示例,并继续在 REPL 中对其进行评估。

PS

这不是 this question 的副本 - 它很可能已过时,并且接受的答案是神秘的(我什至不确定 bREPL 是什么,以及 figwheel 是否使用它)。

是的,您可以在 REPL 中使用宏,就像在代码中一样。

您的示例中宏的限定名称是 clojurescripting.macros/increment(不是 clojurescripting.core/increment),并且假设已加载宏命名空间,您可以调用宏(就像在您的代码中的示例)。这是一个例子:

cljs.user=> (clojurescripting.macros/increment 0)
1

如果尚未加载宏命名空间,您可以使用 require-macros 从 REPL 执行此操作。这是一个示例,即使您的 none 个名称空间正在加载宏名称空间,它也可以工作:

cljs.user=> (require-macros 'clojurescripting.macros)
nil
cljs.user=> (clojurescripting.macros/increment 0)
1

您也可以使用命名空间别名

cljs.user=> (require-macros '[clojurescripting.macros :as macros])
nil
cljs.user=> (macros/increment 0)
1

并引用宏变量

cljs.user=> (require-macros '[clojurescripting.macros :refer [increment]])
nil
cljs.user=> (increment 0)
1

所有这些都应该直接在 REPL 中工作。

事实上,https://clojurescript.org/guides/ns-forms 中讨论的所有变体都应该在 REPL 中工作,使用 require-macros 代替 :require-macrosrequire 代替 :require, .