用途:面向 JVM Clojure(.clj)与 ClojureScript(.cljs,经 Google Closure Compiler 编译为 JS)代码和项目的编写、审查、调试与配置,也涉及 .cljc 共享代码;.clj/.cljc/.cljs 文件、deps.edn、Clojure CLI、Leiningen 等均在范围内。不适用于 nbb(基于 SCI 解释器,无 Closure 优化与 externs),nbb.edn 或 nbb script.cljs 场景应查其自身文档。
主要能力与用法:先判断运行时再动手。REPL 驱动开发,用 clj 启动 REPL,clojure -M -m my.app.main 运行主命名空间,clojure -X:deps tree 查看依赖;用 clojure.test 做行为测试,输入边界用显式谓词或 clojure.spec.alpha 校验,域内失败用 ex-info 携带 ex-data。状态默认不可变,单一身份用 atom + swap!,协同变更才用 ref/dosync;类型提示只在确有反射或重载问题时加;宏仅在函数无法满足求值控制时使用,可先 macroexpand-1 查看。JS 互操作用 (.method obj) 调方法、(.-prop obj) 取属性、(SomeClass. args) 构造、js/ 访问全局,clj->js / js->clj 转换数据。CLJS 异步自 v1.12.145 起支持 ^:async 函数与 await,也可用 core.async;已用 core.async 的代码库应保持一致。构建工具需先查项目中的 shadow-cljs.edn、deps.edn 或 project.clj,不假定工具。
限制与陷阱::optimizations 默认为 :none,未显式设置即运行未优化开发输出;:advanced 下符号重命名会破坏无类型 JS 互操作,需 externs 或字符串键访问;:main 在 :none 下只加载实际 :required 的内容;:output-to 与 :modules 互斥;CLJS 数字均为 JS number(double),无任意精度数值;^:async 元数据只能写在函数名上而非参数向量,await 仅在实际标记 :async 的函数内可用,异步函数总返回 Promise;真值判断只有 false 和 nil 为假,0、空串、NaN、空集合均为真;无自动尾调用优化,深递归应使用 recur、trampoline 或 lazy-seq,memoize 不解决栈溢出。编译器选项较多,需查阅其 references 而非猜测。其他细节如收费、价格、平台等资料未提供。