2024 Clojure 状态调查! 中分享你的观点。

欢迎!请参阅 关于 页面以了解更多有关此功能的详细信息。

+1
ClojureScript

我在编写一个面向 Java 和 JS 的库,发现测试存在问题。理想情况下,我喜欢写一个符合最低限度的测试文件,因为库的 API 和行为设计是不针对特定平台的。

我编写了一些辅助函数和宏来进行测试,但找不到方法使宏解析异步库以进行 cljs 编译。我想到的唯一方法是使用宏两次并使用适当的完全限定函数名,但这非常粗暴,我期望有更好的方法。

1 答案

+1

来自 clara-rules 项目的技术
https://github.com/cerner/clara-rules/blob/main/src/main/clojure/clara/rules/compiler.clj#L88

(ns my.macro) ;; .clj file

(defn compiling-cljs? []
  (boolean
    (when-let [n (find-ns 'cljs.analyzer)]
      (when-let [v (ns-resolve n '*cljs-file*)]
        @v))))

(defmacro my-macro [& body]
  (if (compiling-cljs?)
    (cljs.async/bla)
    (clojure.async/bla)))

;; in cljc call: (my-macro ...)
谢谢。我最终使用了宏并且在环境中检查是否存在 cljs ——即 (some? (:ns &env))。不知道哪种检查更可靠。
@alexmiller 考虑创建一个特性“在宏中使用的读取条件”的工单,因为野外有多个黑客使用 - 最常见的是 `(:ns &env)` 检查,可能是因为这个帖子:https://groups.google.com/g/clojurescript/c/iBY5HaQda4A ;
...