我似乎无法在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是否使用它)。
答案 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} },等。