【问题标题】:How to manage dependencies in a cljs macro?如何在 cljs 宏中管理依赖项?
【发布时间】:2020-08-12 12:31:20
【问题描述】:

假设我在 clj 文件中有一个要在 cljs 文件中使用的宏

(defmacro defelem [name element]
  `(defcard ~name
     (ct.react/react-card
      (r/as-element
       [~element]
       )
      )
     )
  )

依赖项是 ct.react 和 r。 clj 或 cljs 文件中是否需要依赖项?我都试过了,但都没有成功。

我在阴影中得到错误:

(defelem cart-card cart)
-------^------------------------------------------------------------------------
Use of undeclared Var myapp.workspaces.cards/react-card
--------------------------------------------------------------------------------

为什么会这样?

【问题讨论】:

    标签: clojure macros clojurescript


    【解决方案1】:

    编译defmacro 时,不需要存在由完全限定符号命名的变量。这意味着您可以直接在宏中编写它们,并且只要引用的变量在运行时存在,它就可以工作:

    (defmacro defelem [name element]
      `(defcard ~name
         (package.cljs.ns/react-card
          (r/as-element [~element]))))
    

    当然,这意味着如果您尝试引用不存在的 var,编译器将无法保护您,因此您需要比平时更加​​小心。

    查看相关问题:How do I deal with required Clojurescript code from Clojurescript macros?

    由于您使用的是 shadow-cljs,请参阅its own documentation 了解此事:

    由于宏在 CLJ 而不是 CLJS 中运行,因此您在 CLJS 中配置的命名空间别名在宏中将不起作用。如果您需要从其他命名空间访问代码,建议使用完全限定名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-16
      • 2012-02-19
      • 2022-12-05
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多