用途:帮助在 Clojure 代码库中快速、有针对性地阅读代码,避免为理解少量函数而通读全部文件。核心是在“完整读取文件”和“REPL 检查”两种策略间做取舍:完整读取较慢但提供完整上下文(imports、其他函数、设计模式);REPL 检查快速聚焦,但需要知道符号名且该符号已在当前会话中被求值。
决策框架:先明确意图。调试运行时状态(确认近期改动、当前定义、追踪值)应使用 REPL 检查,因为运行时反映真实状态;理解源码设计(首次阅读、函数关系、imports)应完整读取文件;确认符号是否存在可用 meta 加 grep,成本最低。
选择路径:若需要运行时状态,先确认符号是否已在当前 REPL 会话中求值;是则用 source-fn 查看实际运行定义、doc 查看文档字符串、meta 查看元数据与文件位置(filename、line number),否则先检查文件或先求值。若需要源码,知道符号名和命名空间时可用 meta 获取 {:file "..." :line N},再用 sed 抽取局部内容,如 sed -n '45,60p' src/my/app/core.clj;只知道名字不确定命名空间时用 grep -r "defn symbol-name" src/ 定位后读取文件;完全不知道起点则读取整个文件。
工具用法:brepl 与 clj-nrepl-eval 均可,选择已配置好的。brepl 示例:brepl <<'EOF' 后接 (require '[clojure.repl :refer [source-fn doc meta]])、(source-fn 'your.namespace/function-name)、(doc your.namespace/function-name)、(meta #'your.namespace/function-name)。clj-nrepl-eval 示例:clj-nrepl-eval '(source-fn (quote your.namespace/function-name))'、clj-nrepl-eval '(doc your.namespace/function-name)'、clj-nrepl-eval '(meta #'"'"'your.namespace/function-name)'。
适用场景:刚修改函数需验证生效;出现错误行为需调试;首次探索命名空间;知道函数名但不知完整命名空间。限制:首次阅读文件并需要完整上下文、没有可用 REPL、符号属于未加载的外部第三方库时,不应使用本技能,直接读取文件或查阅库文档。关键提示:运行时可能与源码不一致,最近的编辑、REPL 驱动改动或已加载代码可能不同于文件,只有 REPL 检查能看到实际运行内容。