Clojurescript-如何在REPL中使用/导入宏(Figwheel)

时间:2019-01-12 15:02:25

标签: clojurescript

我似乎无法在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。

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

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

PS

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

1 个答案:

答案 0 :(得分:1)

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

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

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

如果尚未加载宏名称空间,则可以使用require-macros从REPL进行。这是一个示例,即使您的名称空间都没有加载宏名称空间,该示例也将起作用:

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

并引用宏vars

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-macros,并用require代替{{1} },