【问题标题】:Clojure: capture runtime value of function arg, to use in REPLClojure:捕获函数 arg 的运行时值,以在 REPL 中使用
【发布时间】:2021-04-13 10:20:57
【问题描述】:

问题

我的 Web 前端调用具有复杂参数的后端查询。在开发过程中,为了避免耗时的手动复制这些参数,我想在 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?还有其他解决方案吗?

【问题讨论】:

  • 尝试添加带有 arg 值的 println 以验证函数正在被调用,并且您正在从前端获取预期值。
  • @AlanThompson,已经尝试过println,函数按预期调用。
  • 如何定义一个带有公共静态字段的自定义 Java 类,您可以将值放入以后读取它?

标签: debugging clojure inline read-eval-print-loop vscode-calva


【解决方案1】:

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

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


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

【讨论】:

  • 你可能想看看'defonce',也许。
猜你喜欢
  • 2014-11-28
  • 2013-10-04
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2011-10-24
  • 2011-03-14
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多