【问题标题】:Clojurescript - how to use/import macros in REPL (figwheel)Clojurescript - 如何在 REPL 中使用/导入宏(无花果)
【发布时间】:2019-01-12 15:02:25
【问题描述】:

我似乎无法在 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 中对其进行评估。

附言

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

【问题讨论】:

    标签: clojurescript


    【解决方案1】:

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

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

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

    如果尚未加载宏命名空间,您可以在 REPL 中使用 require-macros 进行加载。这是一个示例,即使您的命名空间都没有加载宏命名空间,它也可以工作:

    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 .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 2013-07-16
      • 2021-09-17
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多