Clojure:捕获函数 arg 的运行时值,用于 REPL

问题描述

问题

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

研究

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

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

console.log(client.guilds.cache.get(order.guildID).name));

这是 REPL 中 Var 的评估:

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

问题

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

解决方法

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

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


我的 inline-def 问题可能是由于在 Var 绑定到一个值后重新加载命名空间造成的。重新启动 VS Code 并再次仔细地做所有事情后,问题就消失了。