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-macros
和 require
代替 :require
, 等.
我似乎无法在 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-macros
和 require
代替 :require
, 等.