gpt4 book ai didi

clojure - 发生异常时存储函数调用及其参数的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 17:46:02 24 4
gpt4 key购买 nike

这是 Clojure: Compile time insertion of pre/post functions 的跟进

我的目标是调用调试函数而不是抛出异常。我正在寻找存储堆栈帧列表、函数调用及其参数的最佳方法来完成此操作。

我想要一个函数 (my-uber-debug),这样当我调用它时(而不是抛出异常),会发生以下事情:

  • 弹出一个新的 Java 窗口
  • 有当前clojure栈帧的记录
  • 对于每个堆栈帧,都有一个传递给函数的参数的记录

这样我就可以向上/向下移动堆栈帧,并检查传递的参数以到达当前点。 [如果以某种方式,神奇地,我们可以获得在“let”环境中定义的变量,那也太棒了。]

当前想法

我将有一个线程局部变量 uber-debug,它的类型为: StackFrames列表 其中 StackFrame = 函数 + 参数

在每次函数调用时,它会压入(cons 当前函数 + uber-debug 的参数),然后在函数调用结束时,它会从 < em> super 调试

然后,当我调用 (my-uber-debug) 时,它只会弹出一个新的 java 窗口,让我与 uber-debug 进行交互

问题

到目前为止,我的想法可能并不适合设置它。解决这个问题的正确方法是什么?

编辑:

问题不在于 Swing/GUI 部分。这是关于如何存储堆栈帧。

谢谢!

最佳答案

您的答案可能取决于很多因素,所以我将通过给出我的想法来回答这个问题。

如果您只想在发生异常时存储函数调用及其参数,那么要么编写一个宏,要么将函数作为包装器来实现。然后,您必须将所有要调用的函数传递给这个包装器。包装器将执行 try catch 操作以及您需要的任何其他操作。

您可能还想查看 Clojure meta data除了编写包装器之外,因为您正在运行的代码还可以查看其元数据并据此做出一些决定。我从未使用过元数据,但链接中的信息看起来很有希望。

作为最后的想法,通过编辑您的原始帖子并将信息放在那里来执行此操作可能有助于您进一步描述您想要完成的任务。

例如,这些堆栈跟踪是库还是主程序?

至于存储所有这些信息,是多个线程需要它,还是只需要一个线程?

您能否通过将信息存储在程序最高级别的 let 绑定(bind)中来获取信息,还是需要类似 ref 的东西?

关于clojure - 发生异常时存储函数调用及其参数的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com