Clojure:捕获函数 arg 的运行时值,以在 REPL 中使用

Clojure: capture runtime value of function arg, to use in REPL

问题

我的网络前端使用复杂的参数调用后端查询。在开发过程中,为了避免耗时的手动复制这些参数,我想在 Vars 中捕获它们的值,这些值可以在 REPL 中使用。

研究

这个 article 表明内联 def 是一个合适的解决方案,但我无法让它工作。前端调用后,Var 未绑定

我通过 VS Code + Calva 使用 REPL 启动了后端,代码如下:

(defn get-analytics-by-category [params]
  (def params params)
  ...)

下面是 REPL 中 Var 的计算:

#object[clojure.lang.Var$Unbound 0x1298f89e "Unbound: #'urbest.db.queries/params"]

问题

为什么上面的代码没有将参数的值绑定到 Var?还有其他解决方案吗?

我发现的最佳方法是使用 scope-capture 库。它通过在函数中添加 1 行来捕获所有局部变量,然后使用另一个 1 行,您可以将所有这些变量定义为全局变量,这允许您在 REPL 中使用运行时值评估函数中的任何子表达式。

如果您曾花费大量时间重现复杂的运行时值,我强烈建议您观看他们的 8-min demo


我的 inline-def 问题可能是由于在 Var 绑定到一个值后重新加载名称空间引起的。重新启动 VS Code 并再次仔细执行所有操作后,问题就消失了。