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)


我原本预期会对于一个没有{{:require-macros}}宏的{{demo.lib}}以及没有使用{{:include-macros}}或{{:refer-macros}}的{{demo.test}}会有警告。

通过构建API进行编译确实生成了预期的警告,但只有当{{demo.lib}} CLJ命名空间在别处没有要求时。


WARNING: 在line 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)没有Self-require,但如果宏文件至少在其他地方被要求,仍然可以正常工作。

这是预期的行为还是仅是意外的情况?

3 答案

0

评论由:dnolen

这在某种意义上是意外的 - 宏解析简单到有点天真。我不确定我们是否应该现在就对此采取措施。这可能会造成相当多的破坏,但好处很小。

0
by

评论人:mfikes

参见 CRRBV-19

0
by
...