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 提出)
...