请分享您的想法,参加2024 Clojure 状态调查!

欢迎!请查看关于页面获取关于如何使用的更多信息。

0
ClojureScript
据我所知,一个命名空间必须通过{{:require-macros}}自身以自动访问其宏,但这似乎不再准确。

给出以下示例

;; src/demo/lib.cljs
(ns demo.lib)

;; src/demo/lib.clj
(ns demo.lib)

(defmacro foo [& args]
  `(prn ::macro))

;; src/demo/test.cljs
(ns demo.test
  (:require [demo.lib :as lib]))

(lib/foo 1 2 3)


我预计会有一个关于{{lib/foo}}的警告,因为{{demo.lib}}为其宏没有{{:require-macros}},而{{demo.test}}没有使用{{:include-macros}}或{{:refer-macros}}。

通过构建API编译此代码确实会产生预期的警告,但这仅在{{demo.lib}} CLJ命名空间没有在其他地方被要求的时候。


WARNING: 在第5行,src/demo/test.cljs中使用了未声明的Var demo.lib/foo



;; build.clj

(require '[cljs.build.api :as cljs])
;; (require 'demo.lib) ;; 在这里要求这将消除警告

(cljs/build
  "src"
  {:output-dir "out"
   :optimizations :none
   :verbose true})


在build.clj中启用{{(require 'demo.lib)}}可以使警告消失,并且代码正确使用宏。

一些流行的库(例如devcards)不会自动引用,但如果宏文件至少在其他地方被引用,则仍然可以正常工作。

这是预期行为还是偶然出现的?

3 个回答

0

评论者:dnolen

这在某种程度上是意外的 - 宏解析是这样的简单,以至于有点天真。我不确定我们是否应该在这个时候对此采取任何行动。这可能会造成很多破坏而收效甚微。

0

评论者:mfikes

参阅CRRBV-19

0
参考资料:https://clojure.atlassian.net/browse/CLJS-2454(由thheller报告)
...